On 01/07/10 13:11, Patrick Browne wrote:
Neil,
Does the following sum up the situation?
The class Num has subclasses containing various numeric types and the
literal 1 is a value for one or more of those types.
Hence the Haskell compiler says the instance 1) is OK.
But at run time, without the quantified (1:Int), the 1 could of more
than one type, which causes a problem.
I think you have the rough gist, but a few clarifications are
necessary. I've added some angle brackets to show the differences:
The class Num has <instances for> various numeric types and the literal
1 which can be instantiated to any
of those types. At <compile time>, without the qualified (1::Int), the
1 could be instatianted to any type, and so .
All this is at compile-time, not run-time. The problem comes down to
needing to know a specific type in order to pick a type-class instance
-- the functional dependencies are actually irrelevant to this aspect.
Let's say I have this simpler class:
class Big a where
isBig :: a -> Bool
instance Big Int where
isBig x = (x > 1000000) -- big for an Int
instance Big Integer where
isBig x = (x > 1000000000000) -- big for an Integer
If you ask "isBig 99999999", the compiler needs to know which instance
to use. The literal 99999999 can be an Int or an Integer, so the
instance is ambigious, and that will cause the error. So the compiler
needs some clarification to choose an instance.
Thanks,
Neil.