ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

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は怪しいですが、、