Arrowデビュー

Arrowを使ってパスカルの三角形を作ってみた。これは全然Arrowっぽくないんだけど、ちょっとだけ分かった、気がする。

{-
    ArrowPascalTriangle.hs
    :set -farrows
    nisikawa
    2007.04.02
-}
import Control.Arrow
import Data.List (mapAccumL)

newtype PS a b = PS {runPS :: a -> b}

instance Arrow PS where
  arr f         = PS f
  PS f >>> PS g = PS $ g . f
  first (PS f)  = PS $ first f

iterateA f = proc x -> f >>> (arr id &&& iterateA f) >>> arr (uncurry (:)) -< x

ps = arr $ uncurry (\x y -> y ++ [x]) . mapAccumL (\x y -> (y, x + y)) 0

pascalTriangle :: [[Integer]]
pascalTriangle = runPS (iterateA ps) [1]