2011-10-14 10 views
4

Haskellではどのように状態を定義しますか?私の最初のアイデアは、代数的データ型を使用することでした。私はまた、国家のモナドについて聞いたことがありますが、私はそれが何であるか本当にわかりません。 例として、Texas Hold'em Pokerを使用することができます。私たちは、以下の状態を表現する必要があります。Haskellではどのように状態を定義しますか?

  • あなたの手で保持する2枚のカードボード上の
  • カードすることができます前に、選手の
  • アクション:
    • チェック
    • 賭けX
    • 昇給X
  • ポット
  • (制限ポーカー)を高めるために
  • 金額を呼び出すための金額の大きさ
+0

[ハスケルと州](http://stackoverflow.com/questions/3944170/haskell-and-state) –

答えて

10

Haskellで状態を使用する2つの部分があります。最初のものは、ちょうど他の言語のようにあなたのものを表現するためにデータ型をモデリングして作成しています。たとえば:

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... 

は、その後、あなたがこの状態を使用かの部分があります。あなたはモノ作りを始めるのにモナドを知る必要はありません(とにかく基本を習得したら、高度なトピックだけを気にする必要があります)。特に、あなたは本当に "状態"を使用する必要はありません、あなたは機能的なスタイルでこれらの値を受け取って返す必要があります。

たとえば、ラウンドは、テーブル状態(プレーヤーとデッキのリスト)、プレーヤーのアクションのリストを取得し、新しいテーブルの状態を返す関数です(これらのアクションを指定してroudを実行した後)。

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

もちろん、新しいテーブルの作成後に古いテーブルの状態を忘れてしまったことを確認することは、あなたの責任です。国家モナドのようなものは、この種の組織上の問題に役立ちます。

+2

の可能な複製 "とにかく基本を習得したら高度なトピックでしか気にしないでください" - メー、彼自身に。自分を励ましてくれるものを考えさせる前に、自分自身に力を入れていくことが、私のインスピレーションを殺す最も確実な方法です。 – luqui

+0

私は@luquiと一緒にいます。あなたは歩く前に走っていなければなりません。 – rampion

+1

私は確信していません。私はそれが何を置き換えているのか、なぜそれを置き換えるのが最初の良いアイデアであるのかを知った後で、抽象化を実際に行うことができます。 – hugomg

関連する問題