(*function f's definition*)
fun f l j y = l j y
val f = fn : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c
下面的内容对函数f有什么看法?
val f = fn : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c
答案 0 :(得分:2)
要回答此问题,重命名标识符会有所帮助:
fun apply g x y = g x y;
val apply = fn : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c
apply
等同于您所称的f
。非正式地,适用的是两个变量(curried form)和两个参数g
中的函数x,y
,并且实际上将g应用于这些参数。
作为示例g
,定义:
fun sum x y = x + y;
val sum = fn : int -> int -> int
然后,例如:
apply sum 5 7;
val it = 12 : int
在apply
部分
('a -> 'b -> 'c)
是g
的类型。它是多态的。您可以将任何函数应用于适当类型的参数。当你实际使用apply
时(正如我上面用sum
所做的那样),那么SML编译器将有足够的信息来确定哪些具体类型对应于类型变量'a, 'b, 'c
。整体申请类型是
('a -> 'b -> 'c) -> 'a -> 'b -> 'c
表示apply
是一个函数,当提供类型('a -> 'b -> 'c)
的函数和类型'a
和'b
的参数时,会生成类型为{{{1}的结果。 1}}。我不确定是否立即使用'c
,但它确实有助于强调功能应用本身是一个高阶函数的观点。