類型信息從現有構造流向新構造。讓我們來看看你的例子:
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