我为一副卡片定义了一个数据Suit和一个数据Value。我还定义了类型Card和类型Deck。但我不知道如何使用它们。
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]谁能给我一个如何使用这些的例子?
发布于 2017-10-17 13:50:02
我将向您的类型中添加一些派生实例。
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 = 20https://stackoverflow.com/questions/46783028
复制相似问题