在修改我的编程语言考试的同时,标准ML部分有一些类型的推理问题,我可以通过在我的头脑中进行类型推断来完成大部分工作,而且我很擅长它,但是一个让我难过的问题。
我必须写一个类型的函数:
('a - >('b - >'c)) - > ('a - >'b) - > ('a - >'c)
所以在我的脑海里,我应该有一个带有两个参数的函数,即函数f和g。两者都会带一个参数x,但是我不能将这个参数x添加到这个函数中,因为它只需要两个参数,所以我可以使用o运算符创建这个函数,用于管道函数。
所以f接受一个参数,然后返回一个函数 g接受一个参数,并返回一个值。 然后整个函数接受一个值并返回一个值。
我不确定如何仅使用o运算符来应用f和g来暗示这些规则。
任何帮助都会非常感激:) 谢谢,Ciaran
答案 0 :(得分:1)
正如您已经提到的,您需要编写两个参数的函数:
fun my_function f g = body
其中f : 'a -> 'b -> 'c
和g : 'a -> 'b
以及body : 'a -> 'c
。
由于body
的类型为'a -> 'c
,我们可以将其写为
body = fn x => body'
其中body'
的类型为'c
和x : 'a
。
观察f x : 'b -> 'c
和g 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)
组合子。