11

私が使用する 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 のモナド解析でリストモナドを使用することとの関係はありますか?

4

2 に答える 2

6

GenParser は、ParsecT ではなく、Parsec に関して定義されています。パーセクは次のように定義されます。

type Parsec s u = ParsecT s u Identity

したがって、答えは、CharParser を使用する場合、基礎となるモナドは Identity モナドであるということです。

于 2011-11-08T17:12:35.720 に答える