Make Q an instance of Applicative
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 29 Jul 2011 12:04:04 +0000 (13:04 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 29 Jul 2011 12:04:04 +0000 (13:04 +0100)
Thanks to Bas van Dijk for proposing this.

In the end I replaced Functor by Applicative in the
superclasses of Quasi, thus:
  class (Monad m, Applicative m) => Quasi m where
because Functor is a superclass of Applicative.

Language/Haskell/TH/Syntax.hs

index c777b89..18f6029 100644 (file)
@@ -58,6 +58,7 @@ import GHC.Base               ( Int(..), Int#, (<#), (==#) )
 import Language.Haskell.TH.Syntax.Internals
 import Data.Data (Data(..), Typeable, mkConstr, mkDataType, constrIndex)
 import qualified Data.Data as Data
+import Control.Applicative( Applicative(..) )
 import Data.IORef
 import System.IO.Unsafe        ( unsafePerformIO )
 import Control.Monad (liftM)
@@ -70,7 +71,7 @@ import Data.Char        ( isAlpha )
 --
 -----------------------------------------------------
 
-class (Monad m, Functor m) => Quasi m where
+class (Monad m, Applicative m) => Quasi m where
   qNewName :: String -> m Name
        -- ^ Fresh names
 
@@ -149,6 +150,10 @@ instance Monad Q where
 instance Functor Q where
   fmap f (Q x) = Q (fmap f x)
 
+instance Applicative Q where 
+  pure x = Q (pure x) 
+  Q f <*> Q x = Q (f <*> x) 
+
 ----------------------------------------------------
 -- Packaged versions for the programmer, hiding the Quasi-ness
 newName :: String -> Q Name