読者です 読者をやめる 読者になる 読者になる

Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

13章分の8章(途中)

プログラミング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")]

正直,今の自分の実力では理解できませんが,いつか理解出来ることを夢見て読み進めていきたいと思います。