SML中的柯里化匿名函数

21

我有下面这个函数,它可以正常工作:

(fn x => x * 2) 2; 

但是这个不起作用:

(fn x y => x + y ) 2 3;

有人能告诉我为什么吗?或者给我一些提示让它工作起来?


当我改成这样时它就可以工作了: (fn (x,y) => x + y) (2,3);但为什么 (fn x y => x * y) 2 3; 会产生错误? - jjennifer
3个回答

35

(fn x => fn y => x+y) 2 3; 可以运行。但是,fn 没有像 fun 那样定义柯里化函数的语法糖。


3
在标准ML中,一个函数只能有一个参数,因此请使用:
(fn (x,y) => x + y) (2,3) 

类型为

fn: int * int -> int

在这个例子中,(x,y)和(2,3)是一个列表结构。

2
但这会将其更改为非柯里化函数,这与原来不同。 - newacct
哦,柯里化!抱歉,我没听懂问题,sepp2k的回答很好。 - Waverim
另外,(2,3) 不是一个列表结构,而是一个 int * int 类型的元组,与 int list 类型 [2,3] 不同。 - Mateo

2
上面发布的答案是正确的。SML函数只接受一个参数。因此,SML函数只能具有以下两种输入类型之一:
1)t =(t1 * t2 * ... * tN),其中N为某个整数
2)t = a,其中a为某个值。
因此,严格来说,SML仅接受乘积类型或一元类型作为函数参数。更普遍地说,可以将其视为一元类型或某些产品类型的投影。
为了在匿名函数内部进行柯里化,请随意将它们嵌套在彼此中:
fn x1 => fn x2 => ... fn xN => ...
我认为了解以下内容也很重要:
fun a = fn x1 => fn x2 => ... fn xN => ...是语法糖fun a x1 x2 .. xN的完整展开形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接