2011-04-07 62 views
0

我想學習使用Lua的函數式編程。我有一個Java背景。 我想用遞歸方法構建一個鏈。在Java中,我會這樣做:如何在函數式編程中實現帶隱藏參數的函數?

//Java 
public Link buildChain() { 
    return buildChain(null, 0, 100); 
} 


private Link buildChain(Link parentLink, int count, int length) { 

    Link link = new Link(); 
    link.setParentLink(parentLink); 
    if(count != length) { 
     link.setChildLink(buildChain(link, count+1, length)); 
    } 

    return link; 
} 

而顯然我會有一些類鏈接。

現在我將如何實現這一功能風格?該類鏈接將是一個表(在Lua中),存儲父鏈接和子鏈接以及Link需要的任何其他內容。但是,我將如何做這兩個功能? 我會使用閉包(儘管私有方法不使用公共方法的局部變量)還是一種倒置的咖喱?或者只是模式匹配?

任何提示和解釋將非常感激。 哦,我很難找到這個問題的標題 - 如果你有更好的主意,請說出來。

回答

1

我不認爲這個答案有任何'功能',但這裏是我如何在Lua中做到這一點。每個鏈接中的'id'字段僅用於提供唯一的ID:

function buildChain(link, cnt, len) 
    cnt = cnt or some_global_default_cnt or 0 
    len = len or some_global_default_len or 100 
    link = link or { parent=nil, child=nil, id="Link " .. cnt } 

    if cnt < len then 
    link.child = buildChain({parent=link, child=nil, id="Link " .. cnt+1 }, 
          cnt+1, len) 
    end 

    return link 
end 

n = buildChain() 
0

不確定lua語法如何,但是您有2個選項,具體取決於您是否希望在其他上下文中使用輔助函數。

如果輔助函數(第二個函數)本身可能有用,則編寫2個獨立的函數。根據不同的語言,這可能意味着使用2個不同的名稱。

要不然,使第二個本地函數的第一個,就像這個haskelish代碼:

buildChain = worker [] 0 100 where 
    worker parent count link = .... 

事實證明,至少在Haskell,buildChain是不是一個真正的功能。對於所有其他純語言也是如此:因爲worker使用3個常量參數來調用,所以結果總是相同的。