パスカルの三角形を Haskell で

入門Haskell―はじめて学ぶ関数型言語」と「ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門」を書店で見かけ、衝動買いしてしまいました。

そこで、iterate なる、いかにもあつらえたようなリスト関係の関数を見つけてしまったので、衝動的に Haskell 版も書いてみます。

pascal = iterate (\l -> zipWith (+) (0:l) (l ++ [0])) [1]
main = mapM_ print $ take 10 $ pascal

ちなみに、iterate f l は [l, f(l), f(f(l)), f(f(f(l))), ...] を返す無限リスト生成関数です。

http://haskell.g.hatena.ne.jp/hyuki/20060601/pascal に同じようなコードがあった気はしつつ。

もっと無限リストっぽく書けば、以下のようにも書けますが、

pascal = [1] : map (\l -> zipWith (+) (0:l) (l ++ [0])) pascal

それよりは、やはり、上記リンク先に記述がある

pascal = [1]:[zipWith (+) ([0]++p) (p++[0]) | p <- pascal]
-- by Hanataniさん

という内包リスト表現の方が Haskell らしい感じがするのは間違いないですね。

僕はまだまだ修行が足りないので、下に行くほど背筋がぞわぞわしてしまうのですが……。