[commit: base] master: Added missing Functor, Applicative, Alternative and MonadPlus instances Added Applicative and Alternative instances for ReadP and ReadPrec Added Functor, Applicative, Alternative and MonadPlust instances for ArrowMonadx (c010103)
Ian Lynagh
igloo at earth.li
Tue Jan 24 21:58:08 CET 2012
Repository : ssh://darcs.haskell.org//srv/darcs/packages/base
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/c01010387a0c1d4d71de55f2957800337c00264d
>---------------------------------------------------------------
commit c01010387a0c1d4d71de55f2957800337c00264d
Author: Bas van Dijk <v.dijk.bas at gmail.com>
Date: Fri Nov 11 18:47:24 2011 +0100
Added missing Functor, Applicative, Alternative and MonadPlus instances Added Applicative and Alternative instances for ReadP and ReadPrec Added Functor, Applicative, Alternative and MonadPlust instances for ArrowMonadx
>---------------------------------------------------------------
Control/Applicative.hs | 36 +++++++++++++++++++++++++++++++++++-
Control/Arrow.hs | 7 +++++++
2 files changed, 42 insertions(+), 1 deletions(-)
diff --git a/Control/Applicative.hs b/Control/Applicative.hs
index 3a9db61..04e8e9d 100644
--- a/Control/Applicative.hs
+++ b/Control/Applicative.hs
@@ -48,7 +48,7 @@ module Control.Applicative (
import Prelude hiding (id,(.))
import Control.Category
-import Control.Arrow (Arrow(arr, (&&&)), ArrowZero(zeroArrow), ArrowPlus((<+>)))
+import Control.Arrow
import Control.Monad (liftM, ap, MonadPlus(..))
#ifndef __NHC__
import Control.Monad.ST.Safe (ST)
@@ -57,6 +57,16 @@ import qualified Control.Monad.ST.Lazy.Safe as Lazy (ST)
import Data.Functor ((<$>), (<$))
import Data.Monoid (Monoid(..))
+import Text.ParserCombinators.ReadP
+#ifndef __NHC__
+ (ReadP)
+#else
+ (ReadPN)
+#define ReadP (ReadPN b)
+#endif
+
+import Text.ParserCombinators.ReadPrec (ReadPrec)
+
#ifdef __GLASGOW_HASKELL__
import GHC.Conc (STM, retry, orElse)
#endif
@@ -204,6 +214,30 @@ instance Applicative (Either e) where
Left e <*> _ = Left e
Right f <*> r = fmap f r
+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)
+
-- new instances
newtype Const a b = Const { getConst :: a }
diff --git a/Control/Arrow.hs b/Control/Arrow.hs
index 8915f09..73dfe3d 100644
--- a/Control/Arrow.hs
+++ b/Control/Arrow.hs
@@ -296,11 +296,18 @@ instance Monad m => ArrowApply (Kleisli m) where
newtype ArrowMonad a b = ArrowMonad (a () b)
+instance Arrow a => Functor (ArrowMonad a) where
+ fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f
+
instance ArrowApply a => Monad (ArrowMonad a) where
return x = ArrowMonad (arr (\_ -> x))
ArrowMonad m >>= f = ArrowMonad $
m >>> arr (\x -> let ArrowMonad h = f x in (h, ())) >>> app
+instance (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) where
+ mzero = ArrowMonad zeroArrow
+ ArrowMonad x `mplus` ArrowMonad y = ArrowMonad (x <+> y)
+
-- | Any instance of 'ArrowApply' can be made into an instance of
-- 'ArrowChoice' by defining 'left' = 'leftApp'.
More information about the Cvs-libraries
mailing list