Monad

リストがモナドの一種であることを納得した。
http://d.hatena.ne.jp/nuc/20050716/p9

filter (\xs -> foldl (\x -> \y -> 10*x+y) 0 xs == sum (map (\n -> n*n*n) xs) ) $ (\xs -> [ [w,x,y,z]| w<-xs, x<-xs, y<-xs,z<-xs ] ) [0..9]
 [ [0,0,0,0],[0,0,0,1],[0,1,5,3],[0,3,7,0],[0,3,7,1],[0,4,0,7] ]

それで上のコードを下のコードにしてみた。体感で遅くなった。計算回数を見てみるとreductionsの回数が5%ほど増えている。後半は半分の速度になっていたがあまり寄与がないらしい。枝刈りをする?まあいいか。

filter (\xs -> foldl (\x y -> 10 * x + y) 0 xs == sum (map (^3) xs)) $ iterate (\xs -> concat (xs >>= return . (\x -> map (x++) (map (:) [0..9])))) [  ] !! 4

たぶん、(++)がいけないな。