
On Saturday 22 January 2011 19:45:40, Jürgen Doser wrote:
El sáb, 22-01-2011 a las 11:06 -0600, aditya siram escribió:
Ok I've figured out why I can't compile it. But now I'm more confused than ever. The problem was that I have a -XNoMonomorphismRestriction flag on Ghci. Removing this allowed me to compile.
This is indeed a bit tricky, it seems. res has a type-class polymorphic type Read a => ... (the ... is complicated by the fact that you have given a strange signature to test, see below)
With the monomorphism restriction on, ghc takes the type-signature for test, inferes a type for res in the line Just $ fst $ head res, and uses this type for the null res test. Interestingly, it doesn't infer a monomorphic type for res, but insists that the instantiation for the type-class parameter is the same in both occurences.
With no monomorphism restriction, ghc doesn't do this inference, because the type for res in null res may be different to the type of res in Just $ fst $ head res. (i.e., the instantion for the type-class parameter may be different)
You can however make ghc consider res a monomorphic value even with the MR turned off by a) turning on MonoLocalBinds b) turning on ScopedTypeVariables, bringing a into scope (via forall a) and giving res a type signature involving that a or you can avoid all these problems by using the nicer code test s = case reads s of [] -> Nothing ((x,_):_) -> Just x
Finally, are you sure that the given type signature is what you want? Don't you want
test :: Read a => String -> Maybe a
Jürgen