
On 10 July 2010 10:54, Magnus Therning
AFAICS that change should make no difference at all. In fact the line could also be written as
return . Number . read $ x
Yeah - it was a rather poor answer especially as on a proper reading the original poster's question was even asking about that... Here's a better answer: Starting from the line: x <- many1 digit Without a type decl, at this point x :: [a]. /a/ is constrained, as the parsers answer type as the whole computation is with the ParsecT monad transformer. But other than that /a/ is polymorphic. The next line with the read obliges x to be a String (for read to type check): return $ Number . read $ x But this is not enough to give a full type to the whole computation, with the lifting to Number of the "x" the type of the whole function is going to be :: ParsecT s m Number. The stream type /s/ and the monad type /m/ are not resolved. Adding a type signature with the Parser type in Parsec 3 resolves the types of the stream and monad via 2 type synonyms: type Parser = Parsec String () type Parsec s u = ParsecT s u Identity where u is a further type parameter for user state. The base monad is resolved to Identity, the stream is resolved to String.