类型信息从现有构造流向新构造。让我们来看看你的例子:
q2 x y z w = w (x y) (z y)
它可能不是很明显,但这个功能已经调用某些类型的哈斯克尔元。特别是,它使用了具有类型
($) :: (a -> b) -> a -> b
功能应用。事实上,我们可以使用($)
语法就这样让我们的使用的功能应用更加明确。
q2 x y z w = (w $ x $ y) $ z $ y
或者,我们可以重新制定它,比方说,使用Javascript式的语法来看看应用程序更清晰地再次
q2(x)(y)(z)(w) = w(x(y))(z(y))
在任何情况下,应该明确的是,有发生4级功能的应用。从这些我们将产生的信息,给我们的主要类型q2
。
扩展类型推断的主要方法是“统一”,这是说,如果我们知道一个东西有类型A
和B
那么我们必须能够转化A
和B
为C
,第三类这与A
和B
一致。它甚至可以是A
或B
。
| A | B | C |
|--------|--------|--------|
| String | a | String |
| Int | String | <fail> |
| a | b | c | (where we suppose a == b == c)
| a -> b | c -> d | e -> f | (where we suppose a == c == e
| | | | and b == d == f)
正如你可以看到两个统一的进一步的特征:(1)如果和(2)它有时会导致我们假设类型变量之间的平等它可能会失败。一般来说,这就是推论的过程:我们为所有我们不知道的事物分配一个新的类型变量,然后尝试统一所有的部分。一路上我们可能会失败(因此我们说类型检查失败了),或者我们会收集大量的平等信息,告诉我们我们已经引入了大量的冗余类型变量。然后,我们通过消除所有冗余变量来总结信息,直到我们不再需要说明我们的均等。
id :: a -> a
3 :: Num a => a
3 :: Num b => b -- make the variable fresh/not conflict with `a`
id 3 :: Num c => c (supposing a == b == c)
id 3 :: Num a => a (supposing nothing, we've forgotten about b and c)
因此,我们可以应用该方法q2
。手工操作有点冗长,但易于手动完成。我们正在寻找价值q2
的类型。我们知道q2
需要4个参数,返回的东西,所以我们可以通过统一的x
的类型,z
构建类型立即
q2 :: a -> b -> c -> d -> e
我们知道,和w
同类型应用($)
该类型a
和c
绝与功能
q2 :: (f -> g) -> b -> (h -> i) -> d -> e
和它们的输入参数必须具有兼容的类型与他们的参数值兼容y :: b
q2 :: (b -> g) -> b -> (b -> i) -> d -> e
最后,我们可以检查w
看到,它的一个函数,它接受的x y
类型的参数,返回另一个函数,它接受的z y
类型的参数,返回的东西
q2 :: (b -> g) -> b -> (b -> i) -> (g -> (i -> j)) -> e
这由(->)
右关联性,我们通常写为
q2 :: (b -> g) -> b -> (b -> i) -> (g -> i -> j) -> e
最后,我们知道,的返回类型是全功能
q2 :: (b -> g) -> b -> (b -> i) -> (g -> i -> j) -> j
其中,达重命名,是q2
最后,最一般类型的返回类型。
欲了解更多信息,调查Hindley-Milner and Algorithm W。我松散覆盖了大部分的细节,但也有少数剩余的想法,他们都可以仔细更加检查。
@bheklilr他在问怎么做*手工* – chamini2
下面是一个很好的解释(如果有点理论上)它如何工作的链接,一个完整的例子(由第一个人之一实现它在一个真正的编译器不会少)http://web.cecs.pdx.edu/~antoy/Courses/TPFLP/lectures/TYPE/BasicTypechecking.pdf 编辑:和更温和的介绍这里的http:/ /screencasts.chariotsolutions.com/uncovering-the-unknown-principles-of-type-inference-http://screencasts.chariotsolutions.com/uncovering-the-unknown-principles-of-type-inference-http://screencasts .chariotsolutions.com /揭露最未知的原则-的型推理 - – Wes
@ chamini2对不起“布特说,我完全错过了问题的一部分。 – bheklilr