ループ
http://tnomura9.exblog.jp/12169729/
自分で再帰を書かなくてもどっちもなんとかなる.
以下 import Control.Monad しているということで
n 回ループ
今何回目のループかを知りたいときはリストを使って
forM_ [1..n] $ \i -> do putStrLn $ "loop " ++ show i
みたいに書けるし,それが不要な場合は
replicateM_ n $ do putStrLn "loop!"
とも書ける.
条件を満たすまでループ
sequenceUntil_ :: Monad m => (a -> Bool) -> [m a] -> m () sequenceUntil_ p = foldr (\a b -> a >>= \x -> unless (p x) b) (return ())
というように定義しておくと
sequenceUntil null $ repeat $ do cs <- getLine putStrLn cs return cs
と書ける.手続き型言語における do { ... } until (...) なかんじ.
IO に代表されるような副作用を値として表現でき,遅延評価もあるため,アクションからなるリスト [m a] (無限でもいい)を生成してそれを必要な分だけ取り出して実行していくことでループっぽいものができる.
あと
こういうパッケージもある.
http://hackage.haskell.org/package/monad-loops