ゲームのルールで移動が許可されている場合、入力とボードから更新されたボードを生成する関数があります。
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
。演算子を見つけました?~
が、左側の部分性を処理します。
これを達成できる(おそらくより一般的な)コンビネーターはありますか、またはこれを簡潔で慣用的な方法で表現する別の方法はありますか?