手动输入推理

时间:2013-11-20 04:29:54

标签: types scheme type-inference

明天我有一个测试,我们讨论的主题之一是类型推断。我正在审查我们所做的任务,以及我们给出的答案。但是,我似乎无法效仿。我似乎无法将答案联系起来的问题是这个函数:

(define foo (lambda (f x y) ((f x) y)))

现在进行类型推理,首先创建类型:

f : 'f  
x : 'x  
y : 'y  
return = 'r

然后你做了约束。查看将x发送到f的第一个块给出:

'f = 'x -> 'w (w being a new type representing the result of that function).

现在包括y(z是另一个具有函数w结果的新类型):

'w = 'y -> 'z 

这将使'r = 'z'z成为返回的内容)。最后,在我困惑的地方,它就是把它放在一起的地方。对我来说,它会成为:

val foo = fn: 'x -> 'w -> 'z

可以改写为:

val foo = fn: 'x -> ('y -> 'z) -> 'z

但是,给出的答案还包括两种类型('x'y):

val foo = fn: 'x -> ('y -> 'z) * 'x * 'y -> 'z

有人可以向我解释为什么添加这些内容,以及何时使用*

1 个答案:

答案 0 :(得分:3)

您提出的解决方案:

val foo = fn: 'x -> ('y -> 'z) -> 'z

会使foo成为一个函数,它接受类型为'x的单个参数,并返回一个函数,该函数接受类型('y -> 'z)的单个参数并返回类型{{1}的值}}。但是你不能只用一个参数调用'z,所以它显然不是一个参数的函数。它需要是三个参数的函数。让我们仔细看看实际的解决方案。解决方案,

foo

val foo = fn: 'x -> ('y -> 'z) * 'x * 'y -> 'z ---------------- --- --- ----------- 1st 2nd 3rd result type 是一个带三个参数的函数。第一个参数的类型为

foo

这意味着它是一个带'x -> ('y -> 'z) 并返回

的函数
'x

这是一个获取'y -> 'z 并返回'y的函数。第一个参数是函数'z,正如您所描述的那样,它必须能够将f作为参数,并返回一个(可以将x作为参数的函数,返回y)。现在这只是'z第一个参数。 foo有三个参数。第二个是foo,其类型为x,第三个是'x,其类型为y'y类型中的*分隔了参数的类型:

foo