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