【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引数に来る関数は,

「第一引数のパーサーでの解析結果をなんやかんやして,また新たなパーサーを作るよ」

みたいな解釈が良いなと思いました.

「なんやかんや」の部分は,例えばそのまま捨てるでもいいし,例えばそのまま返すでもいいし,例えば次のパーサーで使う判定条件に組み込んでもいいし...といった具合だと解釈してます.