【问题标题】:Need help understanding currying需要帮助理解柯里化
【发布时间】:2011-07-30 20:47:37
【问题描述】:

这是我从这本电子书 (http://www.cs.cornell.edu/riccardo/prog-smlnj/notes-011001.pdf) 中挑选的一个示例

-fun curry (f:'a * 'b -> 'c) = fn (x:'a) => fn (y:'b) => f (x,y);
val curry = fn : ('a * 'b -> 'c) -> 'a -> 'b -> 'c

我如何解释这个函数。 Curry 将 'a * 'b -> 'c 类型的函数 f 作为参数。我无法理解'='之后的部分。什么是关联顺序?

这是另一个例子:

fun add’ (x:int) (y:int):int = x + y;

这是如何解析的?

Wikipedia 说“currying 是一种转换具有多个参数(或参数的 n 元组)的函数的技术,它可以被称为一个函数链,每个函数都有一个参数(部分应用) ”。哪个是单个参数:多个参数中的第一个还是最后一个?

【问题讨论】:

标签: sml


【解决方案1】:

fn (x:'a) => fn (y:'b) => f (x,y) 被解析为fn (x:'a) => (fn (y:'b) => f (x,y))。所以你有一个函数,它接受一个类型为 a 的参数 x 并返回另一个函数,它接受一个类型为 b 的参数 y。然后这个函数返回调用f (x,y)的结果。

fun foo x y = ...val foo = fn x => fn y => ... 的语法糖,所以foo 也是一个函数,它接受一个参数 x 并返回另一个函数,它接受一个参数 y。

同样,foo 1 2 的调用将被解析为(foo 1) 2,即它使用参数 1 调用函数 foo,然后使用参数 2 调用结果函数。

【讨论】:

  • @sepp2k:我刚开始使用 SML。您能否推荐一个我可以使用的好资源(书籍、在线材料)。
猜你喜欢
  • 2012-05-17
  • 1970-01-01
  • 2019-01-28
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多