Hi haskellers,
I'm trying to use buildExpressionParser parser generator from ParsecExpr module of Parsec (http://legacy.cs.uu.nl/daan/download/parsec/parsec.html#ParsecExpr). It works well, except for the "parens" token parser (http://legacy.cs.uu.nl/daan/download/parsec/parsec.html#parens). This code (sample from Expressions part of the manual) typechecks fine:
expr :: Parser Integer
expr = buildExpressionParser table factor
<?> "expression"
table = [[op "*" (*) AssocLeft, op "/" div AssocLeft]
,[op "+" (+) AssocLeft, op "-" (-) AssocLeft]
]
where
op s f assoc
= Infix (do{ string s; return f}) assoc
factor = do{ char '('
; x <- expr
; char ')'
; return x
}
<|> number
<?> "simple expression"
but if I try to use parens:
factor = parens expr
<|> number
<?> "simple expression"
it fails to typecheck:
Couldn't match expected type `GenTokenParser s u m'
against inferred type `Parser Integer'
In the first argument of `parens', namely `expr'
In the first argument of `(<|>)', namely `parens expr'
In the first argument of `(<?>)', namely `parens expr <|> number'
Failed, modules loaded: none.
the type of expr infers to GenParser Char () Integer, and the expected type for the parens is GenTokenParser s u m (however, manual introduces it with the type CharParser st a
expected)
It seems pretty weird for me, as there are numerous examples of using parens with the buildExpressionParser (e.g. http://blog.moertel.com/articles/2005/08/27/power-parsing-with-haskell-and-parsec) and nobody comments such an error. I know I'm missing something very simple here, maybe someone could help me with it? Thanks in advace
I'm using GHC 6.10.1 and Parsec 3.0.0
--
Regards, Paul Sujkov