2013-09-21 19 views
22

我無法獲得Haskell編譯的這行代碼,但它在我教授的系統上工作。我使用ghci 7.6.2版。Haskell代碼行沒有編譯:「非法數據類型上下文」

data Eq a => Shape a = Shape a 

更準確地說,這是我得到

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:1:6: 
Illegal datatype context (use -XDatatypeContexts): Eq a => 
Failed, modules loaded: none. 

什麼是這裏的錯誤的錯誤?

謝謝

+0

[如何修復「非法數據類型上下文」(使用-XDatatypeContexts)?](http://stackoverflow.com/questions/22622399/how-to-fix-illegal-datatype-context-use-xdatatypecontexts ) – wizzup

回答

31

您的教授可能使用的是舊版本的GHC。您發佈的行使用了最近已被刪除的功能。可能的解決方案是:

  1. 刪除Eq a =>data Shape a = Shape a

  2. 正如GHC所說,給-XDatatypeContexts標誌重新啓用已刪除的功能。

的詳細信息:您的類型聲明的Eq a =>部分稱爲數據類型的上下文。它的唯一功能是限制Shape構造函數的類型,以便代替Shape :: a -> Shape a獲得Shape :: Eq a => a -> Shape a。它不會讓您不必在涉及Shape s的類型簽名中編寫Eq a,甚至當您不需要時甚至會要求您編寫它們。當數據類型中的嚴格字段需要類約束時,它曾經很有用,但該特性很久以前就被刪除了。

簡而言之,刪除上下文幾乎總是對程序的改進,所以它們從Haskell 2011語言標準中刪除。由於GHC 7.0.1有一個選項可以將其關閉,並且自7.2.1以來它一直是默認設置。

+0

這種限制的目的當然不是爲了節省我不得不寫的東西,而是通過強迫我寫更多的東西來提高類型安全性。 – Psachnodaimonia

+0

對不起,類型安全不是我正在尋找的單詞。我在想,添加上下文可以在程序句法可能性和語義意圖之間建立更緊密的聯繫,這樣做類型檢查將會使某些語義錯誤變得不可能。 – Psachnodaimonia

+0

@Psachnodaimonia:這不是一個不合理的觀點,但我認爲這個特性比有幫助的更困惑,因爲很多人希望它的行爲與它的行爲不同。 –

5

我認爲錯誤信息是明確的說什麼。你需要一個擴展。

{-# LANGUAGE DatatypeContexts #-} 
data Eq a => Foo a = Foo a 

雖然這個擴展以前是在默認情況下,但是從GHC 7.6開始,它的使用被認爲是deprecated,並會在將來被移除。所以你的教授可能會使用舊版本的ghc。

+0

我決定使用 'data Foo a = Foo a 推導出Eq' 感謝您的回答:) – Goutham

+1

它約束了'數據類型' Foo'可以帶有Eq實例。假設'Bar'是一個沒有任何'Eq'實例的類型,你不能有'Foo Bar'類型。另一方面,派生'Eq'將爲'Foo'派生一個默認的'Eq'實例。你可以有一個'Foo Bar'類型('Bar'沒有'Eq'實例),但是你不能使用'=='。 – Satvik

相關問題