【Haskell】バインド演算子(>>=) の解釈
プログラミングHaskellの8章を読んでいて,Haskellのバインド演算子>>=について1週間ほど悩んだのでメモ。
まずghciでバインド演算子の型を聞くと,
ghci> :t (>>=) (>>=) :: Monad m => m a -> (a -> m b) -> m b
と返ってきます.悩んだのは,第二引数の a-> m bの解釈でした.
型をそのまま読むと,「a型の値を受け取って,b型のmを返す関数」という意味になりますよね.
本の8章には,モナドのインスタンスとしてパーサーが取り上げられていたのですが,a型の値を受け取ってるのにb型のパーサーを返すの?こんな関数あるの?と実体が想像できず理解に苦しみました.
まず本に掲載されていたパーサーの型を再確認すると,
type Parser a = String -> [(a, String)]
です.つまり「解析したい文字列 を受け取って, [(解析結果 :: a , 残り)] という組のリストを返す」という型です.
なので,バインド演算子の第2引数に来る関数は,
「第一引数のパーサーでの解析結果をなんやかんやして,また新たなパーサーを作るよ」
みたいな解釈が良いなと思いました.
「なんやかんや」の部分は,例えばそのまま捨てるでもいいし,例えばそのまま返すでもいいし,例えば次のパーサーで使う判定条件に組み込んでもいいし...といった具合だと解釈してます.