RSS

Listモナド覚書

内包記法(list comprehension)を使わないでモナド的に書いてみる。

import Control.Monad

f1 x = if x > 5 then return x else []
f2 x = guard( x > 5 ) >> return x
f3 x = guard( even x) >> return x
d2 x = return (2 * x)

main = do
  putStrLn $ show $ ([1..10] >>= d2 )
  putStrLn $ show $ ([1..10] >>= f1 )
  putStrLn $ show $ ([1..10] >>= f2 )
  putStrLn $ show $ ([1..10] >>= f2 >>= f3 )
  putStrLn $ show $ ([1..10] >>= f2 >>= f3 >>= d2 )

内包記法がネストすると大変なことになるのでわかりやすくていいね。