我正在尝试使用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?或者只是模式匹配?
非常感谢任何提示和解释。 哦,我很难找到这个问题的标题 - 如果你有更好的想法,请说出来。
答案 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,结果将始终相同。