首页 文章

SML中的Curried匿名函数

提问于
浏览
17

我有以下功能,它的工作原理:

(fn x => x * 2) 2;

但是这个不起作用:

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

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

3 回答

  • 33

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

  • 1

    上面发布的答案是正确的 . 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

  • 2

    在标准ML中,函数只能有 one argument ,所以使用

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

    而且类型是

    fn: int * int -> int
    

    在这个时间(x,y)和(2,3)是一个列表结构,

相关问题