[[PageOutline]]
= Issues with Standard Classes =
This page collects issues and proposals for the standard classes.
Many of the proposals involve additional superclasses, which would be less burdensome with [ticket:101 class aliases] or something similar, but such features are not yet implemented.
== References ==
* [http://www.haskell.org/onlinereport/basic.html#sect6.3 Standard Haskell Classes] of Haskell 98
* [http://www.haskell.org/onlinereport/standard-prelude.html Standard Prelude] of Haskell 98
== Constructor classes ==
=== The Functor class ===
Proposal:
* Add instances for `((->) a)`, `((,) a)` and `Either a`.
=== The Monad class ===
Issues:
* Monads are really functors, but programmers can't always assume that `fmap` is defined for them, and so must use `liftM` instead.
Similarly, code parameterized by `Functor` cannot be used with monads.
* The `fail` method was added to the class in Haskell 98 to implement pattern match failure in `do` expressions.
However the assumption that errors are strings can be problematic (e.g. cf the `Error` class in [http://www.haskell.org/ghc/docs/6.4-latest/html/libraries/mtl/Control-Monad-Error.html Control.Monad.Error], or for internationalization).
Proposals:
* Add instance for `((->) a)`.
* Make `Functor` a superclass of `Monad`.
This would impose an extra burden on those who just want to define a `Monad`.
* Make `join` a method of `Monad`, interdefined with `(>>=)`.
* A more extreme step down this road would be to interpose the new [http://www.haskell.org/ghc/dist/current/docs/libraries/base/Control-Applicative.html Applicative] class between `Functor` and `Monad`, with corresponding renaming of methods.
== Numbers ==
See NumericClasses.
== Other standard classes ==
=== The Read class ===
See ReadClass.
=== The Enum class ===
Issues:
* `succ` and `pred` are unused.
* The default definitions of `enum`* would make more sense if `toEnum` and `fromEnum` used `Integer` instead of `Int`.
* Some doubt that it makes sense to have `Float` and `Double` instances.
* It is wierd that `[0,3..20]::[Rational]` includes `21`.
=== The Ix class ===
Issues:
* There is no portable way to report indexing errors accurately.
Proposal:
* Make `Show` a superclass of `Ix`, so that the offending index and range can be shown in exceptions.
(All instances of `Ix` in the `base` package are also instances of `Show`.)
=== The Bits class ===
Issues:
* The `Num` superclass may unduly restrict instances. The only thing actually needed from `Num` is 0.
* The `bitSize` method is not defined for all instances, and there is no general way to test whether it can be safely called.
=== The Storable class ===
Issues:
* Some interfaces require clients to manage the memory for objects, but to treat them abstractly. In such cases one wants to define `sizeOf` and `alignment` (to use `malloc` or `alloca`), but not `peek` or `poke`.