我有以下功能,它有效:
(fn x => x * 2) 2;
但这个不起作用:
(fn x y => x + y ) 2 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)是列表结构,