2017-10-17 46 views
0

我爲一副紙牌定義了數據Suit和數據Value。我還定義了類型Card和類型Deck。但我不知道如何使用它們。如何在定義它們之後在Haskell中使用數據類型?

data Suit = Club | Diamond | Heart | Spade 

data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | 
    Jack | Queen | King | Ace 

type Card = (Suit, Value) 

type Deck = [Card] 

有人可以給我一個如何使用這些的例子嗎?

+4

我投票結束這個問題作爲題外話,因爲在邁出學習一門新語言的第一步時,它不是替代教程或介紹性教科書。 – dfeuer

回答

4

我將爲您的類型添加一些派生實例。

data Suit = Club | Diamond | Heart | Spade 
    deriving (Bounded, Enum, Eq, Ord, Show) 

data Value 
    = Two | Three | Four | Five | Six | Seven | Eight 
    | Nine | Ten | Jack | Queen | King | Ace 
    deriving (Bounded, Enum, Eq, Ord, Show) 

type Card = (Suit, Value) 

type Deck = [Card] 

這是一些套牌。

royalFlush :: Deck 
royalFlush = [ (Spade, v) | v <- [Ten .. Ace] ] 

completeDeck :: Deck 
completeDeck = 
    [ (s, v) | v <- [minBound .. maxBound], s <- [minBound .. maxBound] ] 

這裏有一個函數來查找一個套牌中的所有俱樂部。

filterClubs :: Deck -> Deck 
filterClubs = filter (\(s, v) -> s == Club) 

隨着random包的幫助下,我們可以選擇一個隨機卡:

import System.Random 

randomCard :: IO Card 
randomCard = 
    let r xs = (xs !!) <$> randomRIO (0, length xs - 1) 
    in (,) <$> r [minBound .. maxBound] <*> r [minBound .. maxBound] 

更重要的是,讓我們使用random-shuffle包,現在我們可以洗牌甲板:

import System.Random.Shuffle 

shuffleDeck :: Deck -> IO Deck 
shuffleDeck = shuffleM 

下面是一個函數,告訴您在bridge中,每個技巧有多少點值得一次不加下注。

import Numeric.Natural 

points :: Suit -> Natural 
points Heart = 30 
points Spade = 30 
points Club = 20 
points Diamond = 20 
相關問題