In short, Q provides the Quasi operations in one neat monad for the user.
The longer story, is that Q wraps an arbitrary Quasi-able monad. The perceptive reader notices that Quasi has only two instances, Q itself and IO, neither of which have concrete implementations.Q plays the trick of dependency inversion, providing an abstract interface for the user which is later concretely fufilled by an concrete Quasi instance, internal to GHC.
Instances10Monad, Functor, MonadFix, MonadFail, Applicative, Quote, …
Monad QDefined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadFunctor QDefined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadMonadFix QDefined in ghc-internal-10.0.0 · GHC.Internal.Control.Monad.FixIf the function passed to mfix inspects its argument, the resulting action will throw a FixIOException.
MonadFail QDefined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadApplicative QDefined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadQuote QDefined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadQuasi QDefined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadMonadIO QDefined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadSemigroup a => Semigroup (Q a)Defined in ghc-internal-10.0.0 · GHC.Internal.TH.MonadMonoid a => Monoid (Q a)Defined in ghc-internal-10.0.0 · GHC.Internal.TH.Monad