1

からText.Parsec.Token:

lexeme p = do { x <- p; whiteSpace; return x }

lexeme はパーサー p を取り、末尾の空白もすべてスキップすることを除いて、p と同じ動作をするパーサーを提供するようです。正しい?

次に、次のことが機能しないのはなぜですか。

constant :: Parser Int
constant = do
    digits <- many1 digit
    return (read digits)

lexConst :: Parser Int
lexConst = lexeme constant

最後の行で、次のエラー メッセージが表示されます。

Couldn't match expected type `ParsecT
                                String () Data.Functor.Identity.Identity Int'
            with actual type `ParsecT s0 u0 m0 a0 -> ParsecT s0 u0 m0 a0'
Expected type: Parser Int
  Actual type: ParsecT s0 u0 m0 a0 -> ParsecT s0 u0 m0 a0
In the return type of a call of `lexeme'
In the expression: lexeme constant

私は何を間違っていますか?

4

2 に答える 2

6

ドキュメンテーションを誤解しました。lexemeエクスポートText.Parsec.Token元は a のフィールドであるGenTokenParser s u mため、タイプは

lexeme :: GenTokenParser s u m -> ParsecT s u m a -> ParsecT s u m a

GenTokenParserで引数を指定していませんlexeme constant

そのフィールドを使用するには、まず aGenTokenParserからGenLanguageDef(通常は を使用して)を作成する必要があります。makeTokenParserlexeme

于 2013-05-06T16:25:28.943 に答える