モナモナ言わないクイズ

http://mew.org/~kazu/material/2011-monad.pdf に3つ問題が出されていたので解いてみる。

lwrap, lbind (P. 26)

解答
-- lwrap :: a -> [a] と, しなかったのは
-- fwrap :: a -> m a に合わせたので
lwrap :: a -> [] a
lwrap x = [x]
-- lwrap と同様に fbind :: m a -> (a -> m b) -> m b に合わせた
lbind :: [] a -> (a -> [] b) -> [] b
lbind xs f = [ y | x <- xs, y <- f x ]

-- もしくは
lbind xs f = concat $ map f xs
-- もしくは
lbind xs f = concatMap f xs
-- 何回目のスタートHaskell だったかは忘れたが、concatMap は concat と map を合わせただけと
-- どなたかが言われていたのを思い出したので concatMap も使ってみた.
答え合わせ
ghci> [1,2] `lbind` \x -> [3,4,5] `lbind` \y -> lwrap (x, y)
[(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)]

mmap (P.41)

解答
mmap :: (a -> b) -> Maybe a -> Maybe b
mmap f Nothing  = Nothing
mmap f (Just x) = Just (f x)
答え合わせ
ghci> (+1) `mmap` Just 1
Just 2