私は Haskell を少しずつ学んでおり、State モナドの理解に (ゆっくりと) 取り組んでいます。状態がブール値のテストを満たすまで State 計算を繰り返す関数を書き、全体的な結果のリストに返された値を収集しようとしています。 . 私は最終的にこれで成功しました:
collectUntil :: (s -> Bool) -> State s a -> State s [a]
collectUntil f s = do s0 <- get
let (a,s') = runState s s0
put s'
if (f s') then return [a] else liftM (a:) $ collectUntil f s
となることによって
simpleState = state (\x -> (x,x+1))
*Main> evalState (collectUntil (>10) simpleState) 0
[0,1,2,3,4,5,6,7,8,9,10]
これはこのタスクにとって合理的な機能ですか、それとももっと慣用的な方法がありますか?