Skip to content

Proposal: Add Applicative instances for the remaining monads in base

The only public monads in base that don't have Applicative instances yet are: ReadP, ReadPrec and ArrowMonad. Because of the rule of least surprise I would like to propose adding Applicative instances for these monads.

Proposal

Concretely I would like to propose adding the following to Control.Applicative:

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

instance Alternative ReadP where
   empty = mzero
   (<|>) = mplus

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

instance Alternative ReadPrec where
   empty = mzero
   (<|>) = mplus

instance Arrow a => Applicative (ArrowMonad a) where
   pure x = ArrowMonad (arr (const x))
   ArrowMonad f <*> ArrowMonad x = ArrowMonad (f &&& x >>> arr (uncurry id))

instance ArrowPlus a => Alternative (ArrowMonad a) where
   empty = ArrowMonad zeroArrow
   ArrowMonad x <|> ArrowMonad y = ArrowMonad (x <+> y)

And adding the following to Control.Arrow:

instance Arrow a => Functor (ArrowMonad a) where
   fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f

instance (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) where
   mzero = ArrowMonad zeroArrow
   ArrowMonad x `mplus` ArrowMonad y = ArrowMonad (x <+> y)

Discussion deadline

I don't think this is a controversial proposal and so I don't expect objections. Can we bend the rules a bit and shorten the discussion period so this can be integrated into the base library that comes with the upcoming ghc-7.4?

Trac metadata
Trac field Value
Version 7.2.1
Type FeatureRequest
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component libraries/base
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information