do式に書き換えてみる
ふつうのHaskellプログラミング p278
上の文字列のリストを扱ったサンプルを、do式に書き換えてみる。
import Monad main = print $ monad ["aaa", "bbb", "ccc", "bbc"] monad xs = do x <- xs startsWithB x endsWithC x startsWithB :: String -> [String] startsWithB xs = if (head xs) == 'b' then [xs] else mzero endsWithC :: String -> [String] endsWithC xs = if (head $ reverse xs) == 'c' then [xs] else mzero
結果はこう。
["bbc"]
普通に動く。
さらに、guard関数を使った形に直してみる。
(参考)Rubyのある風景 - Non Determinism
import Monad main = print $ monad ["aaa", "bbb", "ccc", "bbc"] monad xs = do x <- xs guard $ (head x) == 'b' guard $ (head $ reverse x) == 'c' return x
結果はこう。
["bbc"]
すっきり!
最後のreturn xは怪しいですが、、