你如何在Haskell中定义状态?

Luk*_*uke 4 state haskell

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

  • 你握在手中的两张牌
  • 板上的卡片
  • 在你之前的球员的行动,可以是:
    • 校验
    • 下注x
    • 提高x
  • 锅的大小
  • 拨打的金额
  • 筹集资金(限制扑克)

hug*_*omg 10

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

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...
Run Code Online (Sandbox Code Playgroud)

然后是你如何使用这种状态的一部分.你不需要知道单子开始做的东西(你应该有先进的主题,当你具备了基础知识掌握反正只打扰).特别是你不需要使用"状态",你只需要以函数式接收和返回这些值.

例如,一轮将是一个获取表状态(玩家和牌组列表),一个玩家动作列表并返回一个新表状态的函数(在给出这些动作后播放roud之后).

playRound :: TableState -> [Action] -> TableState
playRound (players, deck) actions = ...
Run Code Online (Sandbox Code Playgroud)

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

  • "当你掌握了掌握的基础知识时,你应该只考虑高级主题" - 嗯,对每个人来说都是如此.在允许自己思考激动我的东西之前强迫自己进入基础知识是杀死我灵感的最可靠方法. (3认同)