【问题标题】:ML function curryingML 函数柯里化
【发布时间】:2012-10-06 01:26:23
【问题描述】:

有人可以向我解释一下柯里化的概念吗?我主要是在学习它,因为我们正在我的“现代编程语言”课程中学习 ML,以介绍函数式语言。

特别是你可以使用这个例子:

    -fun g a = fn b => a+b;
      val g = fn: int -> int -> int
    -g 2 3;
      val it = 5 : int

我很困惑这些参数是如何传递的,或者一开始是如何考虑的。

感谢您的帮助。

【问题讨论】:

    标签: functional-programming sml currying smlnj ml


    【解决方案1】:

    在这种情况下,您使柯里化显式化,因此应该更容易理解。

    如果我们阅读函数定义,它会说(转述):“创建一个函数 g,当给定 a 时返回 fn b => a+b。”

    也就是说,如果我们调用g 2,我们会返回函数fn b => 2+b。因此,当我们调用g 2 3 时,我们实际上调用了(g 2) 3;也就是我们先把上面提到的函数取回来,然后在值3上使用这个函数,得到5

    柯里化只是在几个“阶段”中创建一个函数的概念,每个阶段接受一个输入并产生一个新函数。 SML 对此有语法糖,使g 等同于以下内容:

    fun g a b = a + b;
    

    【讨论】:

    • 完整拼写的版本如下所示:val g = fn a => fn b => a + b。我觉得这很有用,因为它表明函数就是值,fun 关键字没有什么特别的魔力。
    • @waldrumpus:实际上,funval rec 的语法糖,而不是 val,尽管在这种情况下这并不重要。 :)
    • “环境”(我使用的是 SML/NJ)如何知道 fn b=> a+b 中的 a 是什么?那时那不是一个未绑定的变量。也许困惑是我阅读它的方式;我应该从左到右还是从右到左阅读?
    • @nickbonnet:它创建了所谓的闭包,它记住了a 的值,实际上将其代入到发生a 的函数中。
    猜你喜欢
    • 2013-11-16
    • 2015-08-25
    • 2015-10-28
    • 2016-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多