【问题标题】:Curried anonymous function in SMLSML 中的柯里化匿名函数
【发布时间】:2019-12-07 15:40:09
【问题描述】:

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

(fn x => x * 2) 2; 

但是这个不行:

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

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

【问题讨论】:

  • 当我改成这个 (fn (x,y) => x + y) (2,3);但为什么 (fn x y => x * y) 2 3;产生错误

标签: sml smlnj


【解决方案1】:

(fn x => fn y => x+y) 2 3; 有效。 fn 根本没有与 fun 相同的语法糖来定义柯里化函数。

【讨论】:

    【解决方案2】:

    在标准机器学习中,一个函数只能有一个参数,所以使用

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

    类型是

    fn: int * int -> int
    

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

    【讨论】:

    • 但这会将其更改为非咖喱函数,这是不同的
    • 哦,柯里化!抱歉,我没发现问题,sepp2k 的回答很好。
    • 另外,(2,3) 不是一个列表结构,它是一个 int * int 类型的元组,它不同于 int list 类型,它是 [2,3] 的类型。跨度>
    【解决方案3】:

    上面发布的答案是正确的。 SML 函数只接受一个参数。因此,SML 函数只能有两种输入类型之一:

    1) t = (t1 * t2 * ... * tN) ,对于一些 N

    2) t = a,对于一些a

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

    为了在 inside 匿名函数中使用柯里化,请随意将它们嵌套在彼此内部: fn x1 => fn x2 => ... fn xN => ...

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

    【讨论】:

      猜你喜欢
      • 2015-08-25
      • 2017-06-30
      • 2013-10-04
      • 2017-06-09
      • 1970-01-01
      • 2013-11-07
      • 2013-01-13
      • 2019-05-21
      • 2018-01-03
      相关资源
      最近更新 更多