如何在函数式编程中实现隐藏参数的函数?

时间:2011-04-07 14:38:04

标签: functional-programming lua

我正在尝试使用Lua学习函数式编程。我有Java背景。 我想使用递归方法构建一个Chain。在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中),存储父和子链接以及链接所需的任何其他内容。但是我该怎么做这两个功能呢? 我会使用一个闭包(虽然私有方法不使用公共方法的局部变量)或一种倒置的currying?或者只是模式匹配?

非常感谢任何提示和解释。 哦,我很难找到这个问题的标题 - 如果你有更好的想法,请说出来。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

不确定lua语法是如何的,但是你有2个选项,这取决于你是否希望在其他上下文中使用worker函数。

如果worker函数(第二个)可以单独使用,则编写2个独立函数。根据语言的不同,可能意味着使用2个不同的名称。

或者,将第二个函数设为第一个函数,就像在这个haskelish代码中一样:

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

事实证明,至少在Haskell中,buildChain并不是真正的函数。对于所有其他纯语言也是如此:因为使用3个常量参数调用worker,结果将始终相同。