类型函数:标准 ML 中的 ('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c)

A function of type: ('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c) in Standard ML

在复习我的编程语言考试时,标准 ML 部分有一些类型推断问题,我可以通过在脑海中进行类型推断来解决大部分问题,而且我很擅长,但是有一个问题让我很困惑。

我必须编写一个函数类型:

('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c)

所以在我的脑海里,我应该有一个函数,它有两个参数,即函数 f 和 g。两者都带有一个参数 x,但我不能将该参数 x 添加到此函数中,因为它只需要两个参数,因此我只能使用 o 运算符创建此函数,用于管道函数。

所以 f 有一个参数,returns 有一个函数 g 接受一个参数, returns 一个值。 然后整体函数取一个值,returns取一个值。

我不确定如何仅使用 o 运算符来应用 f 和 g 来暗示这些规则。

任何帮助将不胜感激:) 谢谢,夏兰

正如您已经提到的,您需要编写一个具有两个参数的函数:

fun my_function f g = body

其中 f : 'a -> 'b -> 'cg : 'a -> 'b 以及 body : 'a -> 'c

因为body的类型是'a -> 'c,我们可以写成

body = fn x => body'

其中 body' 的类型为 'cx : 'a

观察,f x : 'b -> 'cg x : 'b,如果你有一个 'b -> 'c 类型的函数和一个 'b 类型的值,很容易构造一个值通过将函数应用于参数来键入 'c(f x) (g x).

以上给出了我们:

fun my_function f g = fn x => (f x) (g x)

或者,将 x 移动到定义的左侧,我们得到:

fun my_function f g x = f x (g x)

顺便说一下,如果您熟悉 combinatory logic,那么您可能会注意到结果函数表示 S 组合器。