On 23 Jan 2009, at 14:37, Francesco Bochicchio wrote:
2009/1/23 Paul Visschers
<mail@paulvisschers.net> Hello,
It seems like you have some trouble with grasping the concept of
polymorphism in this particular case.
<...>
I think I get the polymorphism. What I don't get is why a specialized type cannot
replace a more generic type, since the specialized type implements the interface
defined in the generic type.
Suppose I declare this constant:
x :: Num a => a
x = 3 :: Integer
Now suppose I want to use that in a function. It's type signature says that x is *any* numeric type i want it to be, so I'm going to add it to another numeric value:
y :: Complex Float
y = x + (5.3 :+ 6.93)
Unfortunately, x *can't* take the form of any Numeric type – it has to be an Integer, so I can't add it do Complex Floating point numbers.
The type system is telling you "while Integers may imelement the numeric interface, the value 3 :: Integer is not a generic value – it can't take the form of *any* numeric value, only a specific type of numeric values".
Bob