2012-12-07 55 views
4

我下面Haskell的維基頁面上的建議:Performance/Data types,以提高我的代碼的性能,但是當我改變轉換枚舉爲int樣類型在Haskell

data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq) 

newtype Color = Color Int deriving (Eq,Ord,Enum) 
(yellow:red:green:blue:empty:_) = [Color 1 ..] 

正如文章中所建議的那樣,GHC說:

Can't make a derived instance of `Enum Color': 
    `Color' must be an enumeration type 
    (an enumeration consists of one or more nullary, non-GADT constructors) 
    Try -XGeneralizedNewtypeDeriving for GHC's newtype-deriving extension 
In the newtype declaration for `Color' 

我還沒有和Enums合作過,我該怎麼做n顏色轉換爲Enum類型?我是否必須實現它定義的所有功能?我以爲他們都是在你上課的時候實施的。

+1

引用GHC的信息:'嘗試-XGeneralizedNewtypeDeriving for GHC的newtype-deriving extension'。 –

回答

10

有時GHC的建議是不好的,但在這種情況下,它是現貨。在你的文件的頂部,把

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 

GeneralizedNewtypeDeriving是一種語言擴展,它允許你指定一些類應該是「轉」到其代表性的實例。也就是說,newtype Color = Color Int deriving (Enum)說只是通過使用Int(在一些必要的打包/解包之後,GHC爲您生成)實現ColorEnum實例。

但是,如果這是你需要Enum的唯一理由,你也可以忽略它,只是做

(yellow:red:green:blue:empty:_) = map Color [1..] 
4

注意,通過獲得Enum,你會得到一個只有部分正確實施。例如,enumFrom yellow將返回一個相當於map Color $ [1..]的列表,這可能不是您想要的。

因此,我寧願建議手動執行Enum連同Bounded,以便它滿足rules given in the documentation of Enum

我想所有這些東西都可以用Template Haskell自動生成。這將成爲一個有趣的圖書館。