我將爲您的類型添加一些派生實例。
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
我投票結束這個問題作爲題外話,因爲在邁出學習一門新語言的第一步時,它不是替代教程或介紹性教科書。 – dfeuer