[Haskell-beginners] Real world example of Typeclasses > Interfaces

Brent Yorgey byorgey at seas.upenn.edu
Sat Sep 4 13:54:02 EDT 2010


On Sat, Sep 04, 2010 at 01:04:43PM -0400, Alec Benzer wrote:
> On Sat, Sep 4, 2010 at 12:29 PM, Brent Yorgey <byorgey at seas.upenn.edu> wrote:
> 
> I know there are cases where this comes up in Haskell, but in certain
> cases the needs arises only because of the way Haskell handles
> typeclasses. What I mean is, if you had a function: something n =
> [1..n], and your type was a -> [a], a needs to be declared as (Num a,
> Enum a), even though this is sort of redundant, since you can't really
> have a number that isn't also enumerable. I'm talking specifically
> about cases where you'd have (TypeClass1 a, TypeClass2 a), and
> TypeClass1 doesn't imply TypeClass2 or visa versa (Brandon's example
> might have served that purpose, though I'm very new to Haskell and
> haven't gotten a full grasp on monads yet).

No, I really do mean that this comes up all the time in a nontrivial
way.  Here's an example I just pulled randomly from a library of mine:

  -- | Create a scale transformation.
  scaling :: (HasLinearMap v, HasLinearMap (Scalar v),
              Scalar (Scalar v) ~ Scalar v, Fractional (Scalar v))
          => Scalar v -> Transformation v
  scaling s = fromLinear $ (s *^) <-> (^/ s)

None of those class constraints implies any of the others (not even in
theory), and they are all necessary.
 
> Ya but isn't that a pretty big hassle, especially assuming there are
> many useful cases where you require a type to belong to multiple
> typeclasses? 

Sure, it's a hassle, but you were looking for examples of why type
classes are better than interfaces, and I'm not sure that simple
matters of convenience really count.

> Read through some of that (will probably read through more later), but
> as I did it also occurred to me that I guess the typeclass system
> might simply be a necessity to work with the rest of Haskell's type
> system? Ie, the point of them isn't their benefits over interfaces,
> it's that it's just the way things need to work in order to
> effectively connect with algebraic types?

No, you don't need type classes to use algebraic data types; see
OCaml.  Type classes were a major innovation at the time they were
added to Haskell, but algebraic data types had been around for a
while.

-Brent


More information about the Beginners mailing list