|Version 14 (modified by ross@…, 7 years ago) (diff)|
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 class aliases or something similar, but such features are not yet implemented.
The Functor class
- Add instances for ((->) a), ((,) a) and Either a.
The Monad class
- 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 Control.Monad.Error, or for internationalization).
- 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 Applicative class between Functor and Monad, with corresponding renaming of methods.
Other standard classes
The Read class
The Enum class
- 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
- There is no portable way to report indexing errors accurately.
- 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
- 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
- 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.