如何在定义它们之后在Haskell中使用数据类型?

如何在定义它们之后在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] 

有人可以给我一个如何使用这些的例子吗?

+4

我投票结束这个问题作为题外话,因为在迈出学习一门新语言的第一步时,它不是替代教程或介绍性教科书。 – dfeuer

我将为您的类型添加一些派生实例。

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