私が使用する Parsec コンビネータの多くは、次のようなタイプです。
foo :: CharParser st Foo
CharParser
ここでは次のように定義されています。
type CharParser st = GenParser Char st
CharParser
したがって、 は を含む型シノニムでGenParser
あり、それ自体は次のように定義されています。
type GenParser tok st = Parsec [tok] st
GenParser
は、別の型シノニムであり、 を使用して割り当てられ、次のようParsec
に定義されます。
type Parsec s u = ParsecT s u Identity
Parsec
の部分的な適用も同様であり、タイプとともにここにParsecT
リストされています。
data ParsecT s u m a
言葉とともに:
「ParsecT suma は、ストリーム型 s、ユーザー状態型 u、基礎となるモナド m、および戻り型 a を持つパーサーです。」
基礎となるモナドは何ですか?特に、CharParser
パーサーを使用するとどうなりますか? スタックのどこに挿入されているかわかりません。あいまいなパーサーから複数の成功した解析を返すために、Haskell のモナド解析でリストモナドを使用することとの関係はありますか?