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

我正在尝试使用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;
}

显然我需要一个Link类。 现在我该如何以函数式风格实现这个功能?那个Link类将成为一个表(在Lua中),存储父链接和子链接以及Link需要的其他任何东西。但是我该如何编写这两个函数? 我会使用闭包(尽管私有方法不使用公共方法的局部变量)还是一种反转的柯里化?还是只需要模式匹配?

任何提示和解释都将非常受欢迎。 噢,我很难找到这个问题的标题-如果你有更好的构想,请说出来。

原文链接 https://stackoverflow.com/questions/5582840

点赞
stackoverflow用户86604
stackoverflow用户86604

不确定 Lua 语法如何,但您有两个选项,具体取决于您是否希望在其他上下文中使用工作函数。

如果工作函数(第二个函数)也可以独立使用,请编写两个独立的函数。根据语言不同,可能意味着需要使用两个不同的名称。

否则,请将第二个函数局部化到第一个函数中,就像这个 Haskell 代码一样:

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

结果显示,至少在 Haskell 中,buildChain 实际上不是一个函数。这对于所有其他纯语言也是正确的:因为 worker 使用三个常量参数进行调用,结果将始终相同。

2011-04-07 15:05:05
stackoverflow用户83497
stackoverflow用户83497

我不认为这个答案中有什么“实际”作用,但是这是我如何在Lua中完成它的。每个链接中的“id”字段只是为了提供唯一的id:

function buildChain(link, cnt, len)
  cnt = cnt or 全局默认计数或0
  len = len 或 全局默认长度或100
  link = link 或 { 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()
2011-04-07 20:04:40