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]的类型。