[Haskell-cafe] type class design

Uwe Schmidt uwe at fh-wedel.de
Fri Oct 29 08:28:31 EDT 2010


Dear Haskellers,

I've a question about type class design. When
developing the set of functions for a class, there
are often two or more functions, let's say f and g,
where the semantics of g can be expressed by f.

When writing down the code, there are two choices
for g. First g is included in the type class, second
g is defined outside and the signature has a context
referencing the class.

1. case

class Foo a where
  f :: ... a ...
  g :: ... a ...
  g = expr[f]

2. case

class Foo a where
  f :: ... a ...

g :: Foo a => ... a ...
g = expr[f]


What are the reasons for choosing 1., what are the arguments for 2.?

My arguments for 1.:

a) Efficiency: g may be overwritten in an instance declaration
  by a more efficient piece of code.

b) Readability: All functions, which are logically connected
  are grouped together in a single syntactic construct and
  can be found in one place (similar to an interface in Java).

My argument for 2.:

c) Correctness: The semantics for g are fix (relative to f),
  All laws for g hold everywhere, assuming f is implemented
  correctly.

I've sometimes the problem to balance the reasons for 1. and
2 and I doubt, that this list of criteria is complete.

In the standard Haskell classes we can find both cases,
even within a single class.

Eq with (==) as f and (/=) as g belongs to the 1. case, so does
Monad and (>>=) as f and (>>) as g.
But (>=>) and the Monad class fall into
the 2. case. It seem, there is no uniform
or consistent strategy in the core Haskell classes.

What are your best practice rules for this problem?

Expecting your advices,

  Uwe



More information about the Haskell-Cafe mailing list