クラスでボードゲームを書いています。Control.Monad.Loops には、私が望むものに非常に近い iterateUntil 関数があります。ただし、アクションにパラメーター (このターンのボードの状態) を使用させたいと考えています。明示的な再帰を削除するためにできることはありますか?
iterateUntilIO :: (a -> IO a) -> a -> (a -> Bool) -> IO a
iterateUntilIO action state predicate = if predicate state
then return state
else do
nextState <- action state
iterateUntilIO action nextState predicate