A agreed upon technique for dealing with typeclass hierarchies has
been slow to arrive. For instance, all monads are functors, but
providing a monad instance for your type doesn't automatically make it
a functor as well.

All monads are also applicative functors, and Control.Applicative does
have a newtype to recognize them as such:

Prelude> :m + Control.Applicative
Prelude Control.Applicative> :i WrapMonad
newtype WrappedMonad m a = WrapMonad {unwrapMonad :: m a}
       -- Defined in Control.Applicative
Prelude Control.Applicative> :i Applicative
class (Functor f) => Applicative f where
 pure :: a -> f a
 (<*>) :: f (a -> b) -> f a -> f b
       -- Defined in Control.Applicative
instance (Monad m) => Applicative (WrappedMonad m)
 -- Defined in Control.Applicative
...

Just "wrap" up your monad in WrapMonad, treat it like an applicative
functor, and then unwrap it with unwrapMonad.

HTH,
Nick

On 12/1/06, Greg Fitzgerald <[EMAIL PROTECTED]> wrote:
> Text.ParserCombinators.ReadP.(+++) :: ReadP a -> ReadP a -> ReadP a

Wow, fast and complete, Thanks Don!    :)

Would it make sense to derive instances of Applicable and Alternative
for ReadP?  Something like this maybe:

instance Applicative ReadP where
        pure = return
        (<*>) = ap

instance Alternative ReadP where
        empty = pfail
        (<|>) = (<++)

Thanks,
Greg
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to