在GHC-7.7(7.8)閉型的家庭分別介紹:封閉式家庭和類型推斷哈斯克爾
在密閉型家族所有的公式在一個地方定義, 不能擴展,而一個開放的家庭可以在整個模塊中傳播 。一個封閉的家庭的優勢在於它的公式 按順序嘗試,類似於一個長期級函數定義
我要問你,爲什麼下面的代碼無法編譯? GHC應該能夠推斷出所有類型 - GetTheType
僅針對X
類型定義,如果我們註釋掉標記的行,代碼將進行編譯。
這是一個GHC或封閉類型的家庭沒有這樣的優化的錯誤嗎?
代碼:
{-# LANGUAGE TypeFamilies #-}
data X = X
type family GetTheType a where
GetTheType X = X
class TC a where
tc :: GetTheType a -> Int
instance TC X where
tc X = 5
main = do
-- if we comment out the following line, the code compiles
let x = tc X
print "hello"
和錯誤是:
Couldn't match expected type ‛GetTheType a0’ with actual type ‛X’
The type variable ‛a0’ is ambiguous
In the first argument of ‛tc’, namely ‛X’
In the expression: tc X
1 GHC 7.8.X尚未發佈所以這是一個有點早稱之爲一個bug 2.確定封閉式的家庭會是默認的,不需要任何標誌或編譯指示? –
我剛纔在一週前向Richard Eisenberg詢問了這件事,看到底部的評論[here](http://typesandkinds.wordpress.com/2012/12/22/ordered-overlapping-type-family-instances/)。我對那裏的潛力也很興奮。我在紙上勾畫了我認爲推理應該如何工作的機制,並且正在慢慢地努力嘗試進入黑客GHC的想法,但TBH我並不相信這會在任何合理的時間框架內發生。 – jberryman
@ ThomasM.DuBuisson:我們還不知道,但是由於GHC 7.7中提供了這個特性,我們可以對它進行測試並將它的一些行爲簡化爲錯誤。我認爲GHC 7.8應該很快發佈。 –