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 を使ってインストールしてみたらうまくいった。スタックのホームページを次に示す。これから Linux で Haskell を使うときは Stack を使うことになるのだろう。