diff --git a/Cabal/Distribution/Compat/ReadP.hs b/Cabal/Distribution/Compat/ReadP.hs index 5c1113c3b8eeb23e092c38b3d8595c71da3d7377..44b970e559110763f527b89aa6ff4773524cdffe 100644 --- a/Cabal/Distribution/Compat/ReadP.hs +++ b/Cabal/Distribution/Compat/ReadP.hs @@ -69,7 +69,7 @@ module Distribution.Compat.ReadP ) where -import Control.Monad( MonadPlus(..), liftM2 ) +import Control.Monad( MonadPlus(..), liftM2, ap ) import Data.Char (isSpace) import Control.Applicative (Applicative(..)) @@ -93,8 +93,7 @@ instance Functor (P s) where instance Applicative (P s) where pure = return - - f <*> a = f >>= \f' -> fmap f' a + (<*>) = ap instance Monad (P s) where return x = Result x Fail @@ -149,7 +148,7 @@ instance Functor (Parser r s) where instance Applicative (Parser r s) where pure = return - f <*> a = f >>= \f' -> fmap f' a + (<*>) = ap instance Monad (Parser r s) where return x = R (\k -> k x) diff --git a/Cabal/Distribution/PackageDescription/Parse.hs b/Cabal/Distribution/PackageDescription/Parse.hs index 7197b1b15ac58ad8626ef805c3e3fbd783b25a83..6a786c39864b0e8a0e54f4e5c53f47348dcadec0 100644 --- a/Cabal/Distribution/PackageDescription/Parse.hs +++ b/Cabal/Distribution/PackageDescription/Parse.hs @@ -72,7 +72,8 @@ import Data.Char (isSpace) import Data.Maybe (listToMaybe, isJust) import Data.Monoid ( Monoid(..) ) import Data.List (nub, unfoldr, partition, (\\)) -import Control.Monad (liftM, foldM, when, unless) +import Control.Monad (liftM, foldM, when, unless, ap) +import Control.Applicative (Applicative(..)) import System.Directory (doesFileExist) import qualified Data.ByteString.Lazy.Char8 as BS.Char8 @@ -602,6 +603,13 @@ buildInfoNames = map fieldName binfoFieldDescrs -- on the 'mtl' package. newtype StT s m a = StT { runStT :: s -> m (a,s) } +instance Functor f => Functor (StT s f) where + fmap g (StT f) = StT $ \s -> fmap (\(a,s') -> (g a,s')) $ f s + +instance (Monad m, Functor m) => Applicative (StT s m) where + pure = return + (<*>) = ap + instance Monad m => Monad (StT s m) where return a = StT (\s -> return (a,s)) StT f >>= g = StT $ \s -> do diff --git a/Cabal/Distribution/ParseUtils.hs b/Cabal/Distribution/ParseUtils.hs index 16ed6d6a846927c2a906a4f331a72a2cde3225cb..07d91c7926d367e583984b81bc298fa417537476 100644 --- a/Cabal/Distribution/ParseUtils.hs +++ b/Cabal/Distribution/ParseUtils.hs @@ -87,7 +87,7 @@ import Data.Char (isSpace, toLower, isAlphaNum, isDigit) import Data.Maybe (fromMaybe) import Data.Tree as Tree (Tree(..), flatten) import qualified Data.Map as Map -import Control.Monad (foldM) +import Control.Monad (foldM, ap) import Control.Applicative (Applicative(..)) import System.FilePath (normalise) import Data.List (sortBy) @@ -122,7 +122,8 @@ instance Functor ParseResult where instance Applicative ParseResult where pure = ParseOk [] - f <*> a = f >>= \f' -> fmap f' a + (<*>) = ap + instance Monad ParseResult where return = ParseOk [] diff --git a/Cabal/Distribution/Simple/BuildTarget.hs b/Cabal/Distribution/Simple/BuildTarget.hs index daf1c64300d7b67cf81a28baef8212f4e5407217..68f5a772034f69f71a080b111230da74687ba5c1 100644 --- a/Cabal/Distribution/Simple/BuildTarget.hs +++ b/Cabal/Distribution/Simple/BuildTarget.hs @@ -55,6 +55,7 @@ import Data.Either ( partitionEithers ) import qualified Data.Map as Map import Control.Monad +import Control.Applicative (Applicative(..)) import qualified Distribution.Compat.ReadP as Parse import Distribution.Compat.ReadP ( (+++), (<++) ) @@ -769,6 +770,10 @@ instance Functor Match where fmap f (ExactMatch d xs) = ExactMatch d (fmap f xs) fmap f (InexactMatch d xs) = InexactMatch d (fmap f xs) +instance Applicative Match where + pure = return + (<*>) = ap + instance Monad Match where return a = ExactMatch 0 [a] NoMatch d ms >>= _ = NoMatch d ms