2011-04-07 40 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个常量参数来调用,所以结果总是相同的。