二周目読んでて今のとこ一番感動した。
14.13のモナドとファンクタのところで
join :: m (m a) -> m a
として
(>>=) :: AltMonad m => m a -> (a -> m b) -> m b
xs >>= f = join (fmap xs)
となるが、ここへ至る過程が素晴らしい。
14.10のリストモナドにおけるバインド(>>=)を型から構成していく過程を経て拡張していくのでここをよく読んでおくとよい。
ちなみにリストモナドのバインドは
xs (>>=) f = concat (map f xs)
それぞれ、
Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Prelude> :t concat
concat :: [[a]] -> [a]
リストの型が[] a つまり[a]であることから類推できる。
Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。