SML中的Curried匿名函数

时间:2010-03-13 02:18:33

标签: sml smlnj

我有以下功能,它有效:

(fn x => x * 2) 2; 

但这个不起作用:

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

谁能告诉我为什么?或者给我一些暗示让它发挥作用?

3 个答案:

答案 0 :(得分:33)

(fn x => fn y => x+y) 2 3;有效。 fn只是没有相同的语法糖来定义fun具有的curried函数。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

,类型是

fn: int * int -> int

此时(x,y)和(2,3)是列表结构,