On 12/8/11 11:12 AM, Christoph Breitkopf wrote:
Hello,

I'm in the process of implementing a container data type, and wonder what
class instances are generally considered necessary. E.g. is it ok to start
out with a Show that's adequate for debugging, or is it a 'must' to include
instances of everything possible (Eq, Ord if possible, Read, Show, Functor,
...).

And what about the more experimental things? Say, DeepSeq, Typeable, Data?
I'd like to keep this simple at start, and I've admittedly not followed
recent developments in Haskell-land (recent meaning the last 10 years or
so. I _do_ know about hierachical modules ;-) ).

I don't use Typeable or Data, but there are a lot of folks who do, and they seem pretty well entrenched in GHC-standard Haskell. Not sure about non-GHC compiler support.

For a container datatype, I'd consider Foldable and Traversable to be essential (provided that they're actually implementable). These classes are widely used and so they offer a nice standard set of names for common operations. But more than just having a common set of names, implementing these classes ensures a minimum level of completeness for your API--- and that's the essential part.

Functor, Applicative, and Monad are also good to offer whenever possible. Functor is required/implied by Foldable and Traversable. Applicative and Monad just give a nice clean interface--- though you should beware of whether there are multiple law-abiding implementations for these two classes. If there are, then you'll have to worry about which one you offer by default (if any) as well as how people can access the other ones.

--
Live well,
~wren

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to