Haskellで多重forループを書く

ArrowとかApplicativeとかTraversableとかいろいろ使ってコードを書いてみたいなということで、どう書く?orgに登録しました。

とりあえずforループで4つほど書いて見ました。おもしろかったのは、ピラミッドを作る逆順になるあみだくじ。自然に2重ループが書けるなぁという、他の言語からすれば当然のことがすごく新鮮。

よくある三角形を表示するサンプルコードを載せます。

import Data.Traversable

triangle :: Int -> IO ()
triangle n =
    for [1..n] (\y ->
        for [1..n] (\x ->
            if y >= x
               then putChar '*'
               else putChar ' '
        )
     >> putChar '\n'
    )
 >> return ()
*Main> pyramid 5
*    
**   
***  
**** 
*****

これはTraversable.forの代わりに、Control.Monad.forMを使っても同じです。

ArrowやApplicativeはもっと極端に記法が変わるので、こっちもいろいろ書いて見ようと思います。