
On Jun 15, 2010, at 6:11 PM, Sebastian Fischer wrote:
orElse :: CMaybe a a -> CMaybe a a -> CMaybe r a CMaybe ca `orElse` CMaybe cb = CMaybe (\k -> (ca return `mplus` cb return) >>= k)
Good point.
But with this restricted type `orElse` is less useful. For example, one cannot compute
fromCMaybe ((return False `orElse` return True) >>= guard)
because there, the arguments of `orElse` are of type `CMaybe () Bool`.
Silly me! It's not the type of the *arguments* which is `CMaybe () Bool` but the type of the *result* of `orElse`, which is perfectly possible with your implementation! The type may be general enough. Interesting twist! I still don't understand why it is impossible to provide `orElse` with the original type. I will think more about the reason you gave. Sebastian -- Underestimating the novelty of the future is a time-honored tradition. (D.G.)