这个陈述揭示了 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
,尽管它确实有助于强调函数式应用程序本身就是高阶函数的观点。
(*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
,尽管它确实有助于强调函数式应用程序本身就是高阶函数的观点。