4

だから私はHaskellでゲームを書いていて、プレイヤーのターンをさまざまなターンフェーズに相関する一連の状態変更関数として表現しています。元々、これは次のようになります。

let game'  = phase1 game
    game'' = phase2 game'
-- etc.

州の君主制の第一候補ですよね?これにより、よりエレガントになります。

do
  phase1
  phase2
-- etc.

ただし、ボイラープレートの「状態取得」ステップから始めるには、、phase1などを変更する必要があるようです。phase2

phase1 = get >>= \game -> -- ...

これを抽象化する方法があることを望んでいるので、発信者と着信者の両方で定型文を避けることができます。私はこの方法が何であるかを知るにはあまりにも新しいです(これは私の最初の本当のHaskellプロジェクトです)。何かアドバイス?

4

1 に答える 1

8

まあ、それはまだ完全にモナドシックではありません。これは遠藤モノイドの最有力候補です。これにより、よりエレガントになります

game = mconcat [ phase1, phase2, ... ]

そして、各フェーズは次のように書かれています。

phase1 = Endo $ \game -> ...

各フェーズで新しい状態とともにいくつかの追加データを返す必要がある場合は、モナドに移動します。その場合、単純な関数で定型文をより許容できるようになります。

phase :: (GameState -> GameMonad a) -> GameMonad a
phase f = f =<< get

そして、フェーズが書き込まれます。

phase1 = phase $ \game -> do ...

ただし、状態を使用する場合は、おそらく名前を付ける必要があります(たとえば、getsまたはdata-accessorを使用してポイントフリーネスを調整できる場合を除きます)。その場合、より多くのterserを取得することはできません。関数とラムダ。

于 2010-08-05T03:05:56.907 に答える