明天我有一个测试,我们讨论的主题之一是类型推断。我正在审查我们所做的任务,以及我们给出的答案。但是,我似乎无法效仿。我似乎无法将答案联系起来的问题是这个函数:
(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
有人可以向我解释为什么添加这些内容,以及何时使用*
?
答案 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