Fix AMP warnings.
authorAustin Seipp <austin@well-typed.com>
Wed, 11 Sep 2013 23:46:54 +0000 (18:46 -0500)
committerAustin Seipp <austin@well-typed.com>
Wed, 11 Sep 2013 23:47:15 +0000 (18:47 -0500)
Authored-by: David Luposchainsky <dluposchainsky@gmail.com>
Signed-off-by: Austin Seipp <austin@well-typed.com>
32 files changed:
compiler/cmm/CmmLint.hs
compiler/cmm/PprC.hs
compiler/codeGen/StgCmmExtCode.hs
compiler/codeGen/StgCmmMonad.hs
compiler/coreSyn/CoreLint.lhs
compiler/coreSyn/MkExternalCore.lhs
compiler/deSugar/Coverage.lhs
compiler/ghci/ByteCodeAsm.lhs
compiler/ghci/ByteCodeGen.lhs
compiler/hsSyn/Convert.lhs
compiler/llvmGen/LlvmCodeGen/Base.hs
compiler/main/CmdLineParser.hs
compiler/main/DriverPipeline.hs
compiler/main/HscMain.hs
compiler/main/TidyPgm.lhs
compiler/nativeGen/AsmCodeGen.lhs
compiler/nativeGen/NCGMonad.hs
compiler/nativeGen/RegAlloc/Linear/State.hs
compiler/prelude/PrelRules.lhs
compiler/profiling/SCCfinal.lhs
compiler/rename/RnPat.lhs
compiler/simplCore/CoreMonad.lhs
compiler/simplCore/SimplMonad.lhs
compiler/specialise/Specialise.lhs
compiler/stgSyn/CoreToStg.lhs
compiler/stgSyn/StgLint.lhs
compiler/typecheck/TcTyDecls.lhs
compiler/typecheck/TcType.lhs
compiler/types/Unify.lhs
compiler/utils/IOEnv.hs
ghc/GhciMonad.hs
utils/ghc-pkg/Main.hs

index 92a137b..970ce68 100644 (file)
@@ -21,6 +21,8 @@ import Outputable
 import DynFlags
 
 import Data.Maybe
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
 
 -- Things to check:
 --     - invariant on CmmBlock in CmmExpr (see comment there)
@@ -207,6 +209,13 @@ checkCond _ expr
 
 newtype CmmLint a = CmmLint { unCL :: DynFlags -> Either SDoc a }
 
+instance Functor CmmLint where
+      fmap = liftM
+
+instance Applicative CmmLint where
+      pure = return
+      (<*>) = ap
+
 instance Monad CmmLint where
   CmmLint m >>= k = CmmLint $ \dflags ->
                                 case m dflags of
index 149968d..d45b103 100644 (file)
@@ -52,6 +52,8 @@ import Data.Map (Map)
 import Data.Word
 import System.IO
 import qualified Data.Map as Map
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
 
 import Data.Array.Unsafe ( castSTUArray )
 import Data.Array.ST hiding ( castSTUArray )
@@ -986,6 +988,13 @@ pprExternDecl _in_srt lbl
 type TEState = (UniqSet LocalReg, Map CLabel ())
 newtype TE a = TE { unTE :: TEState -> (a, TEState) }
 
+instance Functor TE where
+      fmap = liftM
+
+instance Applicative TE where
+      pure = return
+      (<*>) = ap
+
 instance Monad TE where
    TE m >>= k  = TE $ \s -> case m s of (a, s') -> unTE (k a) s'
    return a    = TE $ \s -> (a, s)
index e710204..df17339 100644 (file)
@@ -48,6 +48,9 @@ import Module
 import UniqFM
 import Unique
 
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
+
 
 -- | The environment contains variable definitions or blockids.
 data Named
@@ -76,6 +79,13 @@ returnExtFC a   = EC $ \_ s -> return (s, a)
 thenExtFC :: CmmParse a -> (a -> CmmParse b) -> CmmParse b
 thenExtFC (EC m) k = EC $ \e s -> do (s',r) <- m e s; unEC (k r) e s'
 
+instance Functor CmmParse where
+      fmap = liftM
+
+instance Applicative CmmParse where
+      pure = return
+      (<*>) = ap
+
 instance Monad CmmParse where
   (>>=) = thenExtFC
   return = returnExtFC
index 27d4fd6..3d82e69 100644 (file)
@@ -74,6 +74,7 @@ import UniqSupply
 import FastString
 import Outputable
 
+import qualified Control.Applicative as A
 import Control.Monad
 import Data.List
 import Prelude hiding( sequence, succ )
@@ -113,6 +114,10 @@ newtype FCode a = FCode (CgInfoDownwards -> CgState -> (# a, CgState #))
 instance Functor FCode where
   fmap f (FCode g) = FCode $ \i s -> case g i s of (# a, s' #) -> (# f a, s' #)
 
+instance A.Applicative FCode where
+      pure = return
+      (<*>) = ap
+
 instance Monad FCode where
         (>>=) = thenFC
         return = returnFC
index 1913e3a..ffddd78 100644 (file)
@@ -1025,6 +1025,13 @@ The same substitution also supports let-type, current expressed as
 Here we substitute 'ty' for 'a' in 'body', on the fly.
 -}
 
+instance Functor LintM where
+      fmap = liftM
+
+instance Applicative LintM where
+      pure = return
+      (<*>) = ap
+
 instance Monad LintM where
   return x = LintM (\ _   _     errs -> (Just x, errs))
   fail err = failWithL (text err)
index a0776af..bdb54d8 100644 (file)
@@ -32,6 +32,7 @@ import DynFlags
 import FastString
 import Exception
 
+import Control.Applicative (Applicative(..))
 import Control.Monad
 import qualified Data.ByteString as BS
 import Data.Char
@@ -55,6 +56,14 @@ data CoreState = CoreState {
                      cs_dflags :: DynFlags,
                      cs_module :: Module
                  }
+
+instance Functor CoreM where
+    fmap = liftM
+
+instance Applicative CoreM where
+    pure = return
+    (<*>) = ap
+
 instance Monad CoreM where
   (CoreM m) >>= f = CoreM (\ s -> case m s of
                                     (s',r) -> case f r of
index bdcf9c9..889155c 100644 (file)
@@ -964,6 +964,13 @@ data TM a = TM { unTM :: TickTransEnv -> TickTransState -> (a,FreeVars,TickTrans
         -- a combination of a state monad (TickTransState) and a writer
         -- monad (FreeVars).
 
+instance Functor TM where
+    fmap = liftM
+
+instance Applicative TM where
+    pure = return
+    (<*>) = ap
+
 instance Monad TM where
   return a = TM $ \ _env st -> (a,noFVs,st)
   (TM m) >>= k = TM $ \ env st ->
index e3119a7..dd8bbe4 100644 (file)
@@ -35,6 +35,7 @@ import Outputable
 import Platform
 import Util
 
+import Control.Applicative (Applicative(..))
 import Control.Monad
 import Control.Monad.ST ( runST )
 import Control.Monad.Trans.Class
@@ -223,6 +224,13 @@ data Assembler a
   | Emit Word16 [Operand] (Assembler a)
   | NullAsm a
 
+instance Functor Assembler where
+    fmap = liftM
+
+instance Applicative Assembler where
+    pure = return
+    (<*>) = ap
+
 instance Monad Assembler where
   return = NullAsm
   NullAsm x >>= f = f x
index 9c9526d..ee4895d 100644 (file)
@@ -55,6 +55,7 @@ import Data.List
 import Foreign
 import Foreign.C
 
+import Control.Applicative (Applicative(..))
 import Control.Monad
 import Data.Char
 
@@ -1586,6 +1587,13 @@ thenBc_ (BcM expr) (BcM cont) = BcM $ \st0 -> do
 returnBc :: a -> BcM a
 returnBc result = BcM $ \st -> (return (st, result))
 
+instance Functor BcM where
+    fmap = liftM
+
+instance Applicative BcM where
+    pure = return
+    (<*>) = ap
+
 instance Monad BcM where
   (>>=) = thenBc
   (>>)  = thenBc_
index 383b641..8a4f7d8 100644 (file)
@@ -32,7 +32,8 @@ import FastString
 import Outputable
 
 import qualified Data.ByteString as BS
-import Control.Monad( unless )
+import Control.Monad( unless, liftM, ap )
+import Control.Applicative (Applicative(..))
 
 import Language.Haskell.TH as TH hiding (sigP)
 import Language.Haskell.TH.Syntax as TH
@@ -72,6 +73,13 @@ newtype CvtM a = CvtM { unCvtM :: SrcSpan -> Either MsgDoc a }
 -- In particular, we want it on binding locations, so that variables bound in
 -- the spliced-in declarations get a location that at least relates to the splice point
 
+instance Functor CvtM where
+    fmap = liftM
+
+instance Applicative CvtM where
+    pure = return
+    (<*>) = ap
+
 instance Monad CvtM where
   return x       = CvtM $ \_   -> Right x
   (CvtM m) >>= k = CvtM $ \loc -> case m loc of
index dda2c9e..6ae3c42 100644 (file)
@@ -54,6 +54,9 @@ import UniqSupply
 import ErrUtils
 import qualified Stream
 
+import Control.Monad (ap)
+import Control.Applicative (Applicative(..))
+
 -- ----------------------------------------------------------------------------
 -- * Some Data Types
 --
@@ -209,13 +212,19 @@ type LlvmEnvMap = UniqFM LlvmType
 
 -- | The Llvm monad. Wraps @LlvmEnv@ state as well as the @IO@ monad
 newtype LlvmM a = LlvmM { runLlvmM :: LlvmEnv -> IO (a, LlvmEnv) }
+
+instance Functor LlvmM where
+    fmap f m = LlvmM $ \env -> do (x, env') <- runLlvmM m env
+                                  return (f x, env')
+
+instance Applicative LlvmM where
+    pure = return
+    (<*>) = ap
+
 instance Monad LlvmM where
     return x = LlvmM $ \env -> return (x, env)
     m >>= f  = LlvmM $ \env -> do (x, env') <- runLlvmM m env
                                   runLlvmM (f x) env'
-instance Functor LlvmM where
-    fmap f m = LlvmM $ \env -> do (x, env') <- runLlvmM m env
-                                  return (f x, env')
 
 instance HasDynFlags LlvmM where
     getDynFlags = LlvmM $ \env -> return (envDynFlags env, env)
index 252a376..6681186 100644 (file)
@@ -30,6 +30,9 @@ import SrcLoc
 import Data.Function
 import Data.List
 
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
+
 
 --------------------------------------------------------
 --         The Flag and OptKind types
@@ -72,6 +75,13 @@ newtype EwM m a = EwM { unEwM :: Located String -- Current parse arg
                               -> Errs -> Warns
                               -> m (Errs, Warns, a) }
 
+instance Monad m => Functor (EwM m) where
+    fmap = liftM
+
+instance Monad m => Applicative (EwM m) where
+    pure = return
+    (<*>) = ap
+
 instance Monad m => Monad (EwM m) where
     (EwM f) >>= k = EwM (\l e w -> do (e', w', r) <- f l e w
                                       unEwM (k r) l e' w')
@@ -108,6 +118,13 @@ liftEwM action = EwM (\_ es ws -> do { r <- action; return (es, ws, r) })
 -- (CmdLineP s) typically instantiates the 'm' in (EwM m) and (OptKind m)
 newtype CmdLineP s a = CmdLineP { runCmdLine :: s -> (a, s) }
 
+instance Functor (CmdLineP s) where
+    fmap = liftM
+
+instance Applicative (CmdLineP s) where
+    pure = return
+    (<*>) = ap
+
 instance Monad (CmdLineP s) where
     m >>= k = CmdLineP $ \s ->
                   let (a, s') = runCmdLine m s
index 7c5bc90..a6567c8 100644 (file)
@@ -669,6 +669,13 @@ newtype CompPipeline a = P { unP :: PipeEnv -> PipeState -> IO (PipeState, a) }
 evalP :: CompPipeline a -> PipeEnv -> PipeState -> IO a
 evalP f env st = liftM snd $ unP f env st
 
+instance Functor CompPipeline where
+    fmap = liftM
+
+instance Applicative CompPipeline where
+    pure = return
+    (<*>) = ap
+
 instance Monad CompPipeline where
   return a = P $ \_env state -> return (state, a)
   P m >>= k = P $ \env state -> do (state',a) <- m env state
index ad1b7c5..774f5be 100644 (file)
@@ -194,6 +194,13 @@ knownKeyNames =              -- where templateHaskellNames are defined
 
 newtype Hsc a = Hsc (HscEnv -> WarningMessages -> IO (a, WarningMessages))
 
+instance Functor Hsc where
+    fmap = liftM
+
+instance Applicative Hsc where
+    pure = return
+    (<*>) = ap
+
 instance Monad Hsc where
     return a    = Hsc $ \_ w -> return (a, w)
     Hsc m >>= k = Hsc $ \e w -> do (a, w1) <- m e w
@@ -203,9 +210,6 @@ instance Monad Hsc where
 instance MonadIO Hsc where
     liftIO io = Hsc $ \_ w -> do a <- io; return (a, w)
 
-instance Functor Hsc where
-    fmap f m = m >>= \a -> return $ f a
-
 runHsc :: HscEnv -> Hsc a -> IO a
 runHsc hsc_env (Hsc hsc) = do
     (a, w) <- hsc hsc_env emptyBag
index d6a3da1..9886fe3 100644 (file)
@@ -749,6 +749,13 @@ newtype DFFV a
       -> (VarSet, [Var])      -- Input State: (set, list) of free vars so far
       -> ((VarSet,[Var]),a))  -- Output state
 
+instance Functor DFFV where
+    fmap = liftM
+
+instance Applicative DFFV where
+    pure = return
+    (<*>) = ap
+
 instance Monad DFFV where
   return a = DFFV $ \_ st -> (st, a)
   (DFFV m) >>= k = DFFV $ \env st ->
index 42eeb4f..cd00a82 100644 (file)
@@ -80,6 +80,7 @@ import qualified Stream
 import Data.List
 import Data.Maybe
 import Control.Exception
+import Control.Applicative (Applicative(..))
 import Control.Monad
 import System.IO
 
@@ -873,6 +874,13 @@ cmmToCmm dflags this_mod (CmmProc info lbl live graph)
 
 newtype CmmOptM a = CmmOptM (DynFlags -> Module -> [CLabel] -> (# a, [CLabel] #))
 
+instance Functor CmmOptM where
+    fmap = liftM
+
+instance Applicative CmmOptM where
+    pure = return
+    (<*>) = ap
+
 instance Monad CmmOptM where
   return x = CmmOptM $ \_ _ imports -> (# x, imports #)
   (CmmOptM f) >>= g =
index fec6805..3ee3af2 100644 (file)
@@ -41,6 +41,9 @@ import Unique           ( Unique )
 import DynFlags
 import Module
 
+import Control.Monad    ( liftM, ap )
+import Control.Applicative ( Applicative(..) )
+
 data NatM_State
         = NatM_State {
                 natm_us          :: UniqSupply,
@@ -65,6 +68,13 @@ initNat init_st m
         = case unNat m init_st of { (r,st) -> (r,st) }
 
 
+instance Functor NatM where
+      fmap = liftM
+
+instance Applicative NatM where
+      pure = return
+      (<*>) = ap
+
 instance Monad NatM where
   (>>=) = thenNat
   return = returnNat
index a608a94..dc499c9 100644 (file)
@@ -40,13 +40,21 @@ import DynFlags
 import Unique
 import UniqSupply
 
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
+
 
 -- | The register allocator monad type.
 newtype RegM freeRegs a
         = RegM { unReg :: RA_State freeRegs -> (# RA_State freeRegs, a #) }
 
+instance Functor (RegM freeRegs) where
+      fmap = liftM
+
+instance Applicative (RegM freeRegs) where
+      pure = return
+      (<*>) = ap
 
--- | The RegM Monad
 instance Monad (RegM freeRegs) where
   m >>= k   =  RegM $ \s -> case unReg m s of { (# s, a #) -> unReg (k a) s }
   return a  =  RegM $ \s -> (# s, a #)
index 64a9f9b..3b895d8 100644 (file)
@@ -49,6 +49,7 @@ import Platform
 import Util
 import Coercion     (mkUnbranchedAxInstCo,mkSymCo,Role(..))
 
+import Control.Applicative ( Applicative(..), Alternative(..) )
 import Control.Monad
 import Data.Bits as Bits
 import qualified Data.ByteString as BS
@@ -540,6 +541,13 @@ mkBasicRule op_name n_args rm
 newtype RuleM r = RuleM
   { runRuleM :: DynFlags -> InScopeEnv -> [CoreExpr] -> Maybe r }
 
+instance Functor RuleM where
+    fmap = liftM
+
+instance Applicative RuleM where
+    pure = return
+    (<*>) = ap
+
 instance Monad RuleM where
   return x = RuleM $ \_ _ _ -> Just x
   RuleM f >>= g = RuleM $ \dflags iu e -> case f dflags iu e of
@@ -547,6 +555,10 @@ instance Monad RuleM where
     Just r -> runRuleM (g r) dflags iu e
   fail _ = mzero
 
+instance Alternative RuleM where
+    empty = mzero
+    (<|>) = mplus
+
 instance MonadPlus RuleM where
   mzero = RuleM $ \_ _ _ -> Nothing
   mplus (RuleM f1) (RuleM f2) = RuleM $ \dflags iu args ->
index 5417ad4..fdcf744 100644 (file)
@@ -36,6 +36,9 @@ import FastString
 import SrcLoc
 import Util
 
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
+
 
 stgMassageForProfiling
         :: DynFlags
@@ -220,6 +223,13 @@ newtype MassageM result
                  -> (CollectedCCs, result)
     }
 
+instance Functor MassageM where
+      fmap = liftM
+
+instance Applicative MassageM where
+      pure = return
+      (<*>) = ap
+
 instance Monad MassageM where
     return x = MassageM (\_ ccs -> (ccs, x))
     (>>=) = thenMM
index e7cecf8..9488f91 100644 (file)
@@ -44,7 +44,7 @@ import {-# SOURCE #-} TcSplice ( runQuasiQuotePat )
 
 import HsSyn            
 import TcRnMonad
-import TcHsSyn          ( hsOverLitName )
+import TcHsSyn             ( hsOverLitName )
 import RnEnv
 import RnTypes
 import DynFlags
@@ -54,14 +54,14 @@ import NameSet
 import RdrName
 import BasicTypes
 import Util
-import ListSetOps       ( removeDups )
+import ListSetOps          ( removeDups )
 import Outputable
 import SrcLoc
 import FastString
-import Literal          ( inCharRange )
-import TysWiredIn       ( nilDataCon )
-import DataCon          ( dataConName )
-import Control.Monad    ( when )
+import Literal             ( inCharRange )
+import TysWiredIn          ( nilDataCon )
+import DataCon             ( dataConName )
+import Control.Monad       ( when, liftM, ap )
 import Data.Ratio
 \end{code}
 
@@ -98,6 +98,13 @@ newtype CpsRn b = CpsRn { unCpsRn :: forall r. (b -> RnM (r, FreeVars))
                                             -> RnM (r, FreeVars) }
         -- See Note [CpsRn monad]
 
+instance Functor CpsRn where
+    fmap = liftM
+
+instance Applicative CpsRn where
+    pure = return
+    (<*>) = ap
+
 instance Monad CpsRn where
   return x = CpsRn (\k -> k x)
   (CpsRn m) >>= mk = CpsRn (\k -> m (\v -> unCpsRn (mk v) k))
index 0af8201..548e04c 100644 (file)
@@ -106,6 +106,7 @@ import Data.IORef
 import Data.Map (Map)
 import qualified Data.Map as Map
 import Data.Word
+import qualified Control.Applicative as A
 import Control.Monad
 
 import Prelude hiding   ( read )
@@ -819,10 +820,14 @@ instance Monad CoreM where
             let w = w1 `plusWriter` w2 -- forcing w before returning avoids a space leak (Trac #7702)
             return $ seq w (y, s'', w)
 
-instance Applicative CoreM where
+instance A.Applicative CoreM where
     pure = return
     (<*>) = ap
 
+instance MonadPlus IO => A.Alternative CoreM where
+    empty = mzero
+    (<|>) = mplus
+
 -- For use if the user has imported Control.Monad.Error from MTL
 -- Requires UndecidableInstances
 instance MonadPlus IO => MonadPlus CoreM where
index 4c3c72d..6a90883 100644 (file)
@@ -29,7 +29,7 @@ import CoreMonad
 import Outputable
 import FastString
 import MonadUtils
-import Control.Monad    ( when )
+import Control.Monad       ( when, liftM, ap )
 \end{code}
 
 %************************************************************************
@@ -97,6 +97,14 @@ computeMaxTicks dflags size
 {-# INLINE thenSmpl_ #-}
 {-# INLINE returnSmpl #-}
 
+
+instance Functor SimplM where
+    fmap = liftM
+
+instance Applicative SimplM where
+    pure = return
+    (<*>) = ap
+
 instance Monad SimplM where
    (>>)   = thenSmpl_
    (>>=)  = thenSmpl
index a175e5e..b83cecf 100644 (file)
@@ -34,6 +34,7 @@ import Outputable
 import FastString
 import State
 
+import Control.Applicative (Applicative(..))
 import Control.Monad
 import Data.Map (Map)
 import qualified Data.Map as Map
@@ -1867,6 +1868,13 @@ data SpecState = SpecState {
                      spec_dflags :: DynFlags
                  }
 
+instance Functor SpecM where
+    fmap = liftM
+
+instance Applicative SpecM where
+    pure = return
+    (<*>) = ap
+
 instance Monad SpecM where
     SpecM x >>= f = SpecM $ do y <- x
                                case f y of
index c87de4e..80b81a6 100644 (file)
@@ -44,6 +44,8 @@ import ForeignCall
 import Demand           ( isSingleUsed )
 import PrimOp           ( PrimCall(..) )
 
+import Control.Monad (liftM, ap)
+
 -- Note [Live vs free]
 -- ~~~~~~~~~~~~~~~~~~~
 --
@@ -982,6 +984,13 @@ thenLne :: LneM a -> (a -> LneM b) -> LneM b
 thenLne m k = LneM $ \env lvs_cont
   -> unLneM (k (unLneM m env lvs_cont)) env lvs_cont
 
+instance Functor LneM where
+    fmap = liftM
+
+instance Applicative LneM where
+    pure = return
+    (<*>) = ap
+
 instance Monad LneM where
     return = returnLne
     (>>=)  = thenLne
index 3509a83..04349db 100644 (file)
@@ -25,6 +25,7 @@ import Util
 import SrcLoc
 import Outputable
 import FastString
+import Control.Applicative ( Applicative(..) )
 import Control.Monad
 import Data.Function
 
@@ -319,6 +320,13 @@ initL (LintM m)
         Just (vcat (punctuate blankLine (bagToList errs)))
     }
 
+instance Functor LintM where
+      fmap = liftM
+
+instance Applicative LintM where
+      pure = return
+      (<*>) = ap
+
 instance Monad LintM where
     return a = LintM $ \_loc _scope errs -> (a, errs)
     (>>=) = thenL
index 5091cab..4f3971b 100644 (file)
@@ -48,6 +48,7 @@ import UniqSet
 import Util
 import Maybes
 import Data.List
+import Control.Applicative (Applicative(..))
 import Control.Monad
 \end{code}
 
@@ -772,6 +773,14 @@ data RoleInferenceInfo = RII { var_ns :: VarPositions
 newtype RoleM a = RM { unRM :: Maybe RoleInferenceInfo
                             -> RoleInferenceState
                             -> (a, RoleInferenceState) }
+
+instance Functor RoleM where
+    fmap = liftM
+
+instance Applicative RoleM where
+    pure = return
+    (<*>) = ap
+
 instance Monad RoleM where
   return x = RM $ \_ state -> (x, state)
   a >>= f  = RM $ \m_info state -> let (a', state') = unRM a m_info state in
index af67808..fddd160 100644 (file)
@@ -182,6 +182,8 @@ import Outputable
 import FastString
 
 import Data.IORef
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
 \end{code}
 
 %************************************************************************
@@ -1048,6 +1050,13 @@ data OccCheckResult a
   | OC_NonTyVar
   | OC_Occurs
 
+instance Functor OccCheckResult where
+      fmap = liftM
+
+instance Applicative OccCheckResult where
+      pure = return
+      (<*>) = ap
+
 instance Monad OccCheckResult where
   return x = OC_OK x
   OC_OK x     >>= k = k x
index 4b5d2ea..7017088 100644 (file)
@@ -39,6 +39,9 @@ import Type
 import TyCon
 import TypeRep
 import Util
+
+import Control.Monad (liftM, ap)
+import Control.Applicative (Applicative(..))
 \end{code}
 
 
@@ -649,6 +652,13 @@ data BindFlag
 newtype UM a = UM { unUM :: (TyVar -> BindFlag)
                         -> UnifyResultM a }
 
+instance Functor UM where
+      fmap = liftM
+
+instance Applicative UM where
+      pure = return
+      (<*>) = ap
+
 instance Monad UM where
   return a = UM (\_tvs -> Unifiable a)
   fail _   = UM (\_tvs -> SurelyApart) -- failed pattern match
index 583e875..04c11cf 100644 (file)
@@ -42,6 +42,7 @@ import System.IO.Unsafe ( unsafeInterleaveIO )
 import System.IO        ( fixIO )
 import Control.Monad
 import MonadUtils
+import Control.Applicative (Alternative(..))
 
 ----------------------------------------------------------------------
 -- Defining the monad type
@@ -150,9 +151,13 @@ unsafeInterleaveM (IOEnv m) = IOEnv (\ env -> unsafeInterleaveIO (m env))
 
 
 ----------------------------------------------------------------------
--- MonadPlus
+-- Alternative/MonadPlus
 ----------------------------------------------------------------------
 
+instance MonadPlus IO => Alternative (IOEnv env) where
+      empty = mzero
+      (<|>) = mplus
+
 -- For use if the user has imported Control.Monad.Error from MTL
 -- Requires UndecidableInstances
 instance MonadPlus IO => MonadPlus (IOEnv env) where
index a3fe632..54e7e0c 100644 (file)
@@ -46,6 +46,7 @@ import Data.IORef
 import System.CPUTime
 import System.Environment
 import System.IO
+import Control.Applicative (Applicative(..))
 import Control.Monad
 import GHC.Exts
 
@@ -168,13 +169,17 @@ reifyGHCi f = GHCi f'
 startGHCi :: GHCi a -> GHCiState -> Ghc a
 startGHCi g state = do ref <- liftIO $ newIORef state; unGHCi g ref
 
+instance Functor GHCi where
+    fmap = liftM
+
+instance Applicative GHCi where
+    pure = return
+    (<*>) = ap
+
 instance Monad GHCi where
   (GHCi m) >>= k  =  GHCi $ \s -> m s >>= \a -> unGHCi (k a) s
   return a  = GHCi $ \_ -> return a
 
-instance Functor GHCi where
-    fmap f m = m >>= return . f
-
 getGHCiState :: GHCi GHCiState
 getGHCiState   = GHCi $ \r -> liftIO $ readIORef r
 setGHCiState :: GHCiState -> GHCi ()
index 41ed265..30acbe2 100644 (file)
@@ -34,6 +34,7 @@ import Data.Maybe
 
 import Data.Char ( isSpace, toLower )
 import Data.Ord (comparing)
+import Control.Applicative (Applicative(..))
 import Control.Monad
 import System.Directory ( doesDirectoryExist, getDirectoryContents,
                           doesFileExist, renameFile, removeFile,
@@ -1303,6 +1304,13 @@ type ValidateWarning = String
 
 newtype Validate a = V { runValidate :: IO (a, [ValidateError],[ValidateWarning]) }
 
+instance Functor Validate where
+    fmap = liftM
+
+instance Applicative Validate where
+    pure = return
+    (<*>) = ap
+
 instance Monad Validate where
    return a = V $ return (a, [], [])
    m >>= k = V $ do