『プログラミングHaskell』の8章を読んでます。
第8章 関数型パーサー
本書を読んでいて,<<分からなくなる最前線>>に到達しました。「8.4 連結」です。
(>>=) :: Parser a -> (a -> Parser b) -> (Parser b) p >>= f = \inp -> case parse p inp of [] -> [] [(v, out)] -> parse (f v) out
上記の最終行の(f v)が,自分の頭を混乱させているような気がします。
これは,2つのパーサーを組み合わせる方法なので,例えば,
(item >>= item) "abcd"
のようなことができるようになるんだと思います。上記の場合,
case parse item "abcd" of
となり,
[('a', "bcd")] -> parse (item 'a') "bcd"
となるんだと思うのですが,ここで,(item 'a')とはなんだろうと思ってしまいます??
Parser,parse, itemは以下のように定義されています。
type Parser a = String -> [(a, String)] item :: Parser Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x, xs)] parse :: Parser a -> String -> [(a, String)] parse p inp = p inp
追記(2009/12/25)
訳者の山本和彦さんより教えていただきました。ありがとうございます。
*Main> parse (item >>= \x -> item >>= \y -> return (x,y)) "abcd" [(('a','b'),"cd")]
正直,今の自分の実力では理解できませんが,いつか理解出来ることを夢見て読み進めていきたいと思います。