Functional programming 如何在函数编程中实现带有隐藏参数的函数?
我正在尝试使用Lua学习函数式编程。我有Java背景。 我想使用递归方法构建一个链。在Java中,我会这样做: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
//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