ループ

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