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

Functional programming 如何在函数编程中实现带有隐藏参数的函数?,functional-programming,lua,Functional Programming,Lua,我正在尝试使用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(p

我正在尝试使用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中),存储父链接和子链接以及链接所需的任何其他内容。但我该如何实现这两个功能呢? 我会使用闭包(尽管私有方法不使用公共方法的局部变量)还是一种反向curry?还是只是模式匹配

任何提示和解释都将不胜感激。
哦,我很难找到这个问题的标题——如果你有更好的想法,请说出来

不确定lua语法是如何使用的,但您有两个选项,这取决于您是否希望在其他上下文中也使用辅助函数

如果辅助函数(第二个)本身可能有用,请编写两个独立的函数。根据语言的不同,这可能意味着使用两个不同的名称

或者,将第二个函数设置为第一个函数的本地函数,如下面的haskelish代码所示:

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

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

我认为这个答案没有任何“功能性”,但下面是我在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()
函数构建链(链接、cnt、len)
cnt=cnt或某些\u全局\u默认\u cnt或0
len=len或某些\u全局\u默认\u len或100
link=link或{parent=nil,child=nil,id=“link”。.cnt}
如果cnt