0

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

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

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

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

所以 f 接受一个参数并返回一个函数 g 接受一个参数并返回一个值。然后整个函数接受一个值并返回一个值。

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

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

4

1 回答 1

1

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

fun my_function f g = body

在哪里f : 'a -> 'b -> 'cg : 'a -> 'bbody : 'a -> 'c

既然body有类型'a -> 'c,我们可以写成

body = fn x => body'

哪里body'有类型'cx : 'a

观察,那个f x : 'b -> 'cand g 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)

顺便说一句,如果您熟悉组合逻辑,那么您可能会注意到结果函数代表S组合子。

于 2016-12-05T12:35:13.290 回答