
On 2009 Jan 23, at 8:37, Francesco Bochicchio wrote:
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.
Try it this way. The declaration
a :: Num n => n a = 3 :: Integer
is not the same as
AbstractInterface a = new ConcreteClass();
because Integer doesn't implement *all* of Num, in particular nothing needed for the Float, Double, or Complex instances. In a sense, instances in Haskell are inverses of interfaces in Java; in Java you accept more specific but in Haskell you accept *less* specific. This is because an instance actually asserts a "for all possible matching types" requirement, whereas Java asserts an "any matching type" requirement. (Pedantically:
a :: forall n. Num n => n
You don't have to write (and in Haskell 98, can't write, just as in Java you can't explicitly write "forany" in an interface definition) the "forall"; in Haskell98 (and Java respectively) it's there by definition, in Haskell extensions it's implied for top level types for backward compatibility.) In many cases you can treat the two the same because the member types happen to have an exact relationship such that "forall" and "forany" are both satisfied, but Num is too wide (and far too complex; the ideal structure of the Haskell numeric classes is constantly debated). So the equivalence of typeclasses and interfaces is a "most of the time" thing, not a definition or requirement. -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH