
Am Mittwoch, 31. März 2004 10:28 schrieb Henning Thielemann:
On Wed, 31 Mar 2004, Simon Peyton-Jones wrote:
I'm sorry to say that you just can't make Set an instance of Monad.
To make an instance of Monad for a type constructor T you must have a function
bindT :: forall a b. T a -> (a -> T b) -> T b
And there just *is* no such function for Set, because of the need for ordering. There's a less polymorphic function
bindSet :: forall a b. (Ord a, Ord b) => T a -> (a -> T b) -> T b
To translate the question from my problem to this one: What would be if Set would be declared within Ord context, i.e. data (Ord a) => Set a = ... ? Now it would be safe to use Set as Monad because Sets could only constructed from Ord types. But GHC doesn't accept this and an answer to my surprise was (see http://www.haskell.org//pipermail/haskell-cafe/2004-March/005985.html)
"Constraints on datatype declarations are a misfeature of Haskell, and have no useful effect."
This answer is, of course, not very descriptive. The problem is that the context (Ord a) in the data declaration only says that the the data constructor(s) is/are restricted by this context. So if you have a declaration data (Ord a) => Set a = MkSet ..., it means that MkSet has type (Ord a) => ... -> Set a instead of just ... -> Set a. There still exist types Set element where element is not an instance of Ord. You just cannot construct any value of such types except bottom (undefined).
[...]
Wolfgang