你如何在Haskell中定义状态?

时间:2011-10-14 13:08:35

标签: haskell state

如何在Haskell中定义状态?我的第一个想法是使用代数数据类型。我也听说过国家monad,但我真的不知道它是什么。 举个例子,让我们使用Texas hold'em扑克。我们必须代表以下状态:

  • 你握在手中的两张牌
  • 董事会上的卡片
  • 在你之前的球员的行动,可以是:
    • 折叠
    • 检查
    • 下注x
    • raise x
  • 锅的大小
  • 拨打的金额
  • 筹集资金(限量扑克)

1 个答案:

答案 0 :(得分:10)

在Haskell中使用状态有两个部分。第一个是建模和创建数据类型来表示你的东西(就像在任何其他语言中一样)。例如:

data Card = NumberCard Int | Jack | Queen | King | Ace
type Hand = (Card, Card)
data Player = Player Hand Int --a hand and his purse
data Action = Fold | Check | Bet Int | Raise Int
type Deck = [Card]
type TableState = ([Player], Deck)
--and functions to manipulate these, of course...

然后就是使用这个状态的一部分。你不需要知道monad就可以开始制作东西了(当你掌握了基础知识时,你应该只考虑高级主题)。特别是你不需要使用“state”,你只需要以函数式接收和返回这些值。

例如,一个回合将是一个采用表状态(玩家和牌组列表),玩家动作列表并返回新表状态的函数(在给出这些动作后播放roud之后)。 / p>

playRound :: TableState -> [Action] -> TableState
playRound (players, deck) actions = ...

当然,现在您有责任确保在创建新表状态后忘记旧表状态。像州议会这样的事情有助于解决这种组织问题。