如何在定义它们之后在Haskell中使用数据类型?
问题描述:
我为一副纸牌定义了数据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]
有人可以给我一个如何使用这些的例子吗?
答
我将为您的类型添加一些派生实例。
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