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

时间:2016-12-05 12:14:11

标签: functional-programming polymorphism sml polyml

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

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

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

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

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

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

任何帮助都会非常感激:) 谢谢,Ciaran

1 个答案:

答案 0 :(得分:1)

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

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,则很容易构造类型为{的值{1}}将函数应用于参数:'c

上面给出了我们:

(f x) (g x)

或者,将fun my_function f g = fn x => (f x) (g x) 移动到我们得到的定义的左侧:

x

顺便说一句,如果您熟悉combinatory logic,那么您会注意到结果函数代表fun my_function f g x = f x (g x) 组合子。