2013-12-23 38 views
16

在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 
+0

1 GHC 7.8.X尚未發佈所以這是一個有點早稱之爲一個bug 2.確定封閉式的家庭會是默認的,不需要任何標誌或編譯指示? –

+1

我剛纔在一週前向Richard Eisenberg詢問了這件事,看到底部的評論[here](http://typesandkinds.wordpress.com/2012/12/22/ordered-overlapping-type-family-instances/)。我對那裏的潛力也很興奮。我在紙上勾畫了我認爲推理應該如何工作的機制,並且正在慢慢地努力嘗試進入黑客GHC的想法,但TBH我並不相信這會在任何合理的時間框架內發生。 – jberryman

+0

@ ThomasM.DuBuisson:我們還不知道,但是由於GHC 7.7中提供了這個特性,我們可以對它進行測試並將它的一些行爲簡化爲錯誤。我認爲GHC 7.8應該很快發佈。 –

回答

10

有什麼錯封閉式的家庭。問題是類型函數不是內射的。

說,你可以有這種封閉式功能:

data X = X 
data Y = Y 

type family GetTheType a where 
    GetTheType X = X 
    GetTheType Y = X 

你不能推斷的結果類型X參數的類型。

數據家庭內射,但沒有關閉:

{-# LANGUAGE TypeFamilies #-} 

data X = X 

data family GetTheType a 

data instance GetTheType X = RX 

class TC a where 
    tc :: (GetTheType a) -> Int 

instance TC X where 
    tc RX = 5 

main = do 
    let x = tc RX 
    print "hello" 
+2

錯字? 「數據族是內射的,但**不**關閉」 –

+0

@maxtaldykin錯誤修正,謝謝。 – mgampkay

+4

但是對於封閉類型的家族,GHC可以檢查類型函數是否是內射的。我認爲這是獲得它們的原因之一。如果有人正在爲此工作,我不會。 –