SML中的Curried匿名函数

SML中的Curried匿名函数,sml,smlnj,Sml,Smlnj,我有下面的功能,它可以工作: (fn x => x * 2) 2; 但这个不起作用: (fn x y => x + y ) 2 3; 谁能告诉我为什么?或者给我一些提示让它工作起来?(fnx=>fny=>x+y)23工作fn只是没有与fun相同的语法糖来定义咖喱函数。在标准ML中,函数只能有一个参数,因此使用 (fn (x,y) => x + y) (2,3) 类型是 fn: int * int -> int 此时(x,y)和(2,3)是一个列表结构,上面给出

我有下面的功能,它可以工作:

(fn x => x * 2) 2; 
但这个不起作用:

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

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

(fnx=>fny=>x+y)23工作
fn
只是没有与
fun
相同的语法糖来定义咖喱函数。

在标准ML中,函数只能有一个参数,因此使用

(fn (x,y) => x + y) (2,3) 
类型是

fn: int * int -> int

此时(x,y)和(2,3)是一个列表结构,上面给出的答案是正确的。SML函数只接受一个参数。因此,SML函数只能有两种输入类型中的一种:

1)
t=(t1*t2*…*tN)
,对于某些N

2)
t=a
,对于某些
a

因此,从技术上讲,SML只将产品类型或一元类型作为函数的参数。人们可以更普遍地将其视为一元类型或某种产品类型的投影

为了在匿名函数中使用currying,可以随意将它们嵌套在彼此内部,如下所示:
fn-x1=>fn-x2=>。。。fn xN=>…

我认为知道这一点也很重要:
fun a=fn x1=>fn x2=>。。。fn xN=>…
是语法糖的完全扩展:
fun a x1 x2。。xN

当我改成这个(fn(x,y)=>x+y)(2,3)时,它起作用;但是为什么(fn x y=>x*y)23;产生一个错误,但会将其更改为未载波函数,这与currying不同!很抱歉,我没有发现这个问题,sepp2k的答案很好。另外,(2,3)不是列表结构,而是int*int类型的元组,这与int-list类型不同,int-list类型是[2,3]的类型。