2016-12-17 99 views
1

在Haskell中,是否可以動態獲取某個類型的值列表?一個具體的例子是通過將每一個等級的一個生成的撲克牌完整的甲板和適應創建的卡的列表:獲取類型值列表

data Rank = 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | J | Q | K | A 
data Suit = Spades | Hearts | Diamonds | Clubs 
data Card = Card Rank Suit 

deck :: [Card] 
deck = -- get list of ranks and suits to create a deck -- 

這將如何沒有硬編碼值來實現的呢?

+0

是的,但這無關「的類型列表」。 – leftaroundabout

+0

...或帶類型的類。 ('J','Q','黑桃','心臟'等不是類型。) – duplode

+0

什麼是正確的術語? – Shane

回答

2

在這種情況下,最簡單的方法是讓編譯器通過派生的Enum實例生成代碼。

data Rank = Two | Three | Four | Five | Six | Seve | Eight | Nine | Ten | J | Q | K | A 
    deriving (Show, Enum, Bounded) 

data Suit = Spades | Hearts | Diamonds | Clubs 
    deriving (Show, Enum, Bounded) 

data Card = Card Rank Suit 

deck :: [Card] 
deck = do 
    rank <- enumFrom minBound :: [Rank] 
    suit <- enumFrom minBound :: [Suit] 
    return $ Card rank suit 

或列表解析版本:

deck :: [Card] 
deck = [Card rank suit | rank <- enumFrom minBound :: [Rank], suit <- enumFrom minBound :: [Suit]] 
+0

'11:13:無法與實際類型'Int''匹配預期類型'[Rank]' – Shane

+0

@Shane對不起。它應該是'enumFrom',而不是'fromEnum' – user2297560

+0

謝謝!現在我只需要學習'做'。 – Shane