【问题标题】:how do I implement functions with hidden arguments in functional programming?如何在函数式编程中实现带有隐藏参数的函数?
【发布时间】:2011-04-08 04:04:40
【问题描述】:

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

显然我会有一些类链接。

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

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

【问题讨论】:

    标签: functional-programming lua


    【解决方案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()
    

    【讨论】:

      【解决方案2】:

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

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

      否则,将第二个函数设置为第一个函数的本地函数,就像在这个 haskelish 代码中一样:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多