Types 手工类型推断
我明天要考试,我们要讨论的话题之一是类型推断。我正在复习我们做的一项作业,以及我们得到的答案。然而,我似乎不明白。我似乎无法将答案与此函数联系起来的一个问题是:Types 手工类型推断,types,scheme,type-inference,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 repres
(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
的结果),请执行以下操作:
因此,这将使'r='z
('z
是返回的内容)。最后,我感到困惑的是,这一切都在哪里。对我来说,它将成为:
val foo = fn: 'x -> 'w -> 'z
可重写为:
val foo = fn: 'x -> ('y -> 'z) -> 'z
但是,给出的答案还包括两种类型('x
和'y
):
有人能给我解释一下为什么要添加这些,以及何时使用
*
?您建议的解决方案:
val foo = fn: 'x -> ('y -> 'z) -> 'z
将使foo
成为一个函数,该函数接受'x
类型的单个参数,并返回一个函数,该函数接受('y->'z)
类型的单个参数,并返回'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
类型中的*
用于分隔参数类型:
val foo = fn: 'x -> ('y -> 'z) * 'x * 'y -> 'z.
---------------- -- --
f x y
真的在我问过的所有问题中,我认为你的回答是我见过的最好的(并非其他问题都不好)。非常感谢!我不知道每个论点的答案中都有一个单独的小部分。
'y -> 'z
val foo = fn: 'x -> ('y -> 'z) * 'x * 'y -> 'z.
---------------- -- --
f x y