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

What information does this statement reveal about the function f in SML?

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

要回答这个问题,重命名您的标识符会有所帮助:

fun apply g x y = g x y;
val apply = fn : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c

apply等同于你所说的f。 apply 所做的,非正式地,是采用一个函数 g,包含两个变量(在 curried form 中)和两个参数 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 类型的参数时,会产生一个类型的结果'c。我不确定是否会立即使用 apply,尽管它确实有助于强调函数式应用程序本身就是高阶函数的观点。