2016-12-05 67 views
0

类型的函数:('a - >('b - >'c)) - >('a - >'b) - >('a - >'c)在修改我的程序语言考试中,Standard ML部分有几个类型推理问题,我可以通过在头脑中进行类型推理来完成其中的大部分类型推理问题,而且我非常擅长,但是有一个问题让我难以理解。标准ML

我必须写类型的函数:

( '一个 - >(' B - > 'C)) - >(' 一个 - > 'B) - >(' 一个 - > 'c)

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

因此,f取参数,并返回函数 g取一个参数,并返回一个值。 然后整体函数接受一个值并返回一个值。

我不知道我如何应用f和g只使用o操作符暗示这些规则。

任何帮助将非常感激:) 谢谢,夏兰

回答

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 -> '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组合子。

+0

这真是太棒了! 非常感谢你,非常有用,并改变了我对这些问题的看法,欢呼。 – user2930356

+0

很高兴帮助:) –