モナモナ言わないクイズ
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