Catalan number その2

Haskell前回 の処理を実装してみた。

catalan :: Int -> [[Char]]
catalan 0 = [[]]
catalan n = ['N':c1++'E':c2 | i <- [0..n-1], c1 <- catalan i, c2 <- catalan (n-i-1)]

path :: [Char] -> Int -> [[Char]] -> [[Char]]
path  []      _ (s:ss) = (take (length s - 1) s ++ "G") : ss
path ('N':cs) e  ss    = path cs  e    ((replicate (3*e) ' ' ++ "+") : (replicate (3*e) ' ' ++ "|") : ss)
path ('E':cs) e (s:ss) = path cs (e+1) ((s ++ "--+") : ss)

main :: IO ()
main = mapM_ putStrLn $ do (n,cs) <- zip [1..] (catalan 4)
                           ("N="++(show n)++": "++cs):path cs 0 ["S\n"]