Parsec 入門


Parsec: Semigroup クラス

Semigroup クラス

Hackage の Text.Parsec.Prim を見ていたら、Parsec パーサが Semigroup (半群)クラスのインスタンスだという説明があった。この場合 parser_1 <> parser_2 という演算によってパーサ paraser_1 と parser_2 を合成したパーサを <> 演算子で作ることができる。

たとえば次のようなパターンマッチをすると、リターンされるのは2番めのパーサにマッチした文字列だけだ。

Prelude> :m +Text.Parsec
Prelude Text.Parsec> parseTest (string "foo" *> string "bar") "foobar"
"bar"

しかし、<> 演算子を使うと次のように "foo" と "bar" を合成した "foobar" を返してくれる。

Prelude Text.Parsec> parseTest (string "foo" <> string "bar") "foobar"
"foobar"

<> 演算子は左結合でつなげていくこともできる。

Prelude Text.Parsec> parseTest (string "foo" <> many digit <> string "bar")
 "foo123bar"
"foo123bar"

<> 演算子を使わないという手はないと思った。

Stack

Semigroup は比較的新しいバージョンの Text.Parsec でしか使えない。unbuntu の apt install haskell-platform でインストールできる Haskell-Platform は 2014 年からアップデートされていなので使えなかった。それで、stack を使ってインストールしてみたらうまくいった。スタックのホームページを次に示す。

The Haskell Tool Stack

これから Linux で Haskell を使うときは Stack を使うことになるのだろう。