6

ゲームのルールで移動が許可されている場合、入力とボードから更新されたボードを生成する関数があります。

move :: Input -> Board -> Maybe Board

GameStateボードは、いくつかの追加データを使用して型にラップされます。

type GameState = (Board, ...)

moveレンズを使用して、値が得られる場合にゲームの状態でボードを更新したいと思いJustます。ヘルパー関数でこれを行うことができます:

updateGameState :: Input -> GameState -> GameState
updateGameState input gs = gs & _1 %~ (f $ move input)
  where
    f g x = maybe x id (g x)

Lensただし、提供された関数が a を返す場合にのみa のターゲットを変更するコンビネーターがあるかどうか疑問に思ってい ますJust。演算子を見つけました?~が、左側の部分性を処理します。

これを達成できる(おそらくより一般的な)コンビネーターはありますか、またはこれを簡潔で慣用的な方法で表現する別の方法はありますか?

4

1 に答える 1