该陈述揭示了SML中函数f的哪些信息?

时间:2016-03-19 03:42:12

标签: functional-programming sml smlnj

(*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

1 个答案:

答案 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,但它确实有助于强调功能应用本身是一个高阶函数的观点。