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