[Haskell-cafe] The difficulty of designing a sequence class

David Menendez zednenem at psualum.com
Mon Jul 31 19:21:33 EDT 2006

Brian Hulley writes:

> 1) Did Edison choose MonadPlus just because this fitted in with the
> lack of multi-parameter typeclasses in H98?

Instances of Monoid (and your ISeq) have kind *. Instances of MonadPlus
(and Edison's Sequence) have kind * -> *.

Functions like map, zip, and their variants are best defined in terms of
type constructors.

With Sequence, you have

    zipWith :: (Sequence s) => (a -> b -> c) -> s a -> s b -> s c
With ISeq, you'd have to do something like

    zipWith :: (ISeq s1 a, ISeq s2 b, ISeq s3 c) => 
        (a -> b -> c) -> s1 -> s2 -> s3

which isn't able to make any assumptions about s1, s2, and s3 having the
same structure.

> 3) Is it worth bothering to derive ISeq from Monoid (with the
> possible extra inefficiency of the indirection through the
> definitions for append = mappend etc or does the compiler completely
> optimize this out)?

I would expect the compiler to inline append.

> 4) Would it be worth reconsidering the rules for top level names so
> that class methods could always be local to their class (ditto for
> value constructors and field names being local to their type
> constructor).

Qualified module imports are the way to go, here. Do you really want to
start writing "if x Eq/== y Num/+ 1 then ... "?
David Menendez <zednenem at psualum.com> | "In this house, we obey the laws
<http://www.eyrie.org/~zednenem>      |        of thermodynamics!"

More information about the Haskell-Cafe mailing list