首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在定义了数据类型之后,如何在Haskell中使用它们?

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

Stack Overflow用户
提问于 2017-10-17 13:26:42
回答 1查看 72关注 0票数 0

我为一副卡片定义了一个数据Suit和一个数据Value。我还定义了类型Card和类型Deck。但我不知道如何使用它们。

代码语言:javascript
复制
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]

谁能给我一个如何使用这些的例子?

EN

Stack Overflow用户

发布于 2017-10-17 13:50:02

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

代码语言:javascript
复制
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]

这里有一些甲板。

代码语言:javascript
复制
royalFlush :: Deck
royalFlush = [ (Spade, v) | v <- [Ten .. Ace] ]

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

这是一个查找一副牌中所有俱乐部的函数。

代码语言:javascript
复制
filterClubs :: Deck -> Deck
filterClubs = filter (\(s, v) -> s == Club)

random包的帮助下,我们可以随机挑选一张卡片:

代码语言:javascript
复制
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包,现在我们可以洗牌了:

代码语言:javascript
复制
import System.Random.Shuffle

shuffleDeck :: Deck -> IO Deck
shuffleDeck = shuffleM

这是一个函数,它告诉你在bridge中不加倍的赌注每个花招值多少分。

代码语言:javascript
复制
import Numeric.Natural

points :: Suit -> Natural
points Heart   = 30
points Spade   = 30
points Club    = 20
points Diamond = 20
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46783028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档