【发布时间】: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;产生错误
我有下面的功能,它可以工作:
(fn x => x * 2) 2;
但是这个不行:
(fn x y => x + y ) 2 3;
谁能告诉我为什么?或者给我一些提示让它工作?
【问题讨论】:
(fn x => fn y => x+y) 2 3; 有效。 fn 根本没有与 fun 相同的语法糖来定义柯里化函数。
【讨论】:
在标准机器学习中,一个函数只能有一个参数,所以使用
(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 仅将产品类型或一元类型作为函数的参数。人们可以更普遍地将其视为一元类型或某种产品类型的投影。
为了在 inside 匿名函数中使用柯里化,请随意将它们嵌套在彼此内部:
fn x1 => fn x2 => ... fn xN => ...
我认为知道这一点也很重要:
fun a = fn x1 => fn x2 => ... fn xN => ... 是语法糖的完整扩展:fun a x1 x2 .. xN
【讨论】: