在SML中给出以下函数:
fun i a b = let fun j()=a+1 in j end;
该功能的数据类型为:
val i = fn : int -> 'a -> unit -> int
我不明白为什么int -> 'a -> unit -> int
?
为什么不(int * a') -> unit -> int
,因为函数i
收到两个输入。
答案 0 :(得分:2)
这个函数(以及SML中的任何函数)实际上是因为currying而接收一个输入。
技术上有一个带单元的函数,返回带有'返回带有int的函数的函数。
所以
fun foo a b = a + b;
fun foo a = fn b => a + b;
等等。
答案 1 :(得分:2)
如果您将函数定义为fun i (a,b) = ...
,则它将以元组作为参数,其类型确实为(int * 'a) -> unit -> int
。它将被称为i (23,42) ()
((23,42)
是一个元组,()
是单位值。
然而,您将其定义为fun i a b = ...
,它定义了一个接受参数的函数,然后返回另一个接受下一个参数的函数。它是fun i a = fn b => ...
的快捷方式。它可以被称为i a b ()
。