2012-10-22 33 views
3

我的代碼片段看起來是這樣的:有沒有一種簡單的方法可以將派生Enum的數據類型轉換爲列表?

data SomeData = A | B | C | D | E deriving (Show, Enum) 

,我希望能夠達到一定的數值​​容易映射到這些類型。說我想有映射到SomeDatachar S,我可能會做它像這樣:

mappings = zip "abcde" [A, B, C, D, E] 

這將產生[('a',A),('b',B)...]等。我希望Enum類型的類可以讓我能夠通過使用一些便利功能將數據類型轉換成上面列出的列表([A, B, C, D, E]),從而輕鬆完成此操作。

標準庫中是否有這樣的功能?或者如果我想使用類似的東西,我是否需要自己定義它?

回答

3

一般來說,我會做

mappings = zip "abcde" [A..] 

,但我會很誘惑與

mappings = zip ['a' ..] [A ..] 

去,這樣,如果我添加其他字母后,代碼將更新。

與最大限度地面向未來的工作走向我定義

import Data.Char 

data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded) 

allData :: SomeData 
allData = enumFrom minBound 

mapppings = zip (map (toLower.head.show) allData) allData 

,我正在做關於未來的唯一assumtion是,它由單個字母。

但是,這是玩,實際上並沒有那麼清楚。

2

其實,你可以使用一個範圍。

[A .. E] 

正如在無價的Learn You A Haskell中所述。

1

試試這個在ghci中

> [A ..] 
[A,B,C,D,E] 
5

如果您還派生Bounded,那麼你甚至可以做到這一點沒有明確地知道了「最小」的構造函數的名字是什麼:

Prelude> data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded) 
Prelude> [minBound :: SomeData ..] 
[A,B,C,D,E] 
2

添加Bounded到您的派生,你可以做[minBound ..]獲得一個完整的列表。

7

你可以去更通用:

-- added deriving Bounded 
data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded) 

fullRange :: (Bounded a, Enum a) => [a] 
fullRange = enumFromTo minBound maxBound 

和(如果需要具有明確的類型標註:fullRange :: [SomeData]),那麼只需要調用fullRange

相關問題