<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>GhcMonad</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[ window.onload = function () {pageLoad();setSynopsis("mini_GhcMonad.html");}; //]]> </script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">ghc-7.4.2: The GHC API</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Safe Haskell</th><td>None</td></tr></table><p class="caption">GhcMonad</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1"><code><a href="GhcMonad.html#t:Ghc">Ghc</a></code> monad stuff </a><ul><li><a href="#g:2">Warnings </a></li></ul></li></ul></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">class</span> (<a href="../base-4.5.1.0/Control-Monad.html#t:Functor">Functor</a> m, <a href="MonadUtils.html#t:MonadIO">MonadIO</a> m, <a href="Exception.html#t:ExceptionMonad">ExceptionMonad</a> m) => <a href="#t:GhcMonad">GhcMonad</a> m <span class="keyword">where</span><ul class="subs"><li><a href="#v:getSession">getSession</a> :: m <a href="HscTypes.html#t:HscEnv">HscEnv</a></li><li><a href="#v:setSession">setSession</a> :: <a href="HscTypes.html#t:HscEnv">HscEnv</a> -> m ()</li></ul></li><li class="src short"><span class="keyword">newtype</span> <a href="#t:Ghc">Ghc</a> a = <a href="#v:Ghc">Ghc</a> {<ul class="subs"><li><a href="#v:unGhc">unGhc</a> :: <a href="GhcMonad.html#t:Session">Session</a> -> <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a</li></ul>}</li><li class="src short"><span class="keyword">newtype</span> <a href="#t:GhcT">GhcT</a> m a = <a href="#v:GhcT">GhcT</a> {<ul class="subs"><li><a href="#v:unGhcT">unGhcT</a> :: <a href="GhcMonad.html#t:Session">Session</a> -> m a</li></ul>}</li><li class="src short"><a href="#v:liftGhcT">liftGhcT</a> :: <a href="../base-4.5.1.0/Control-Monad.html#t:Monad">Monad</a> m => m a -> <a href="GhcMonad.html#t:GhcT">GhcT</a> m a</li><li class="src short"><a href="#v:reflectGhc">reflectGhc</a> :: <a href="GhcMonad.html#t:Ghc">Ghc</a> a -> <a href="GhcMonad.html#t:Session">Session</a> -> <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a</li><li class="src short"><a href="#v:reifyGhc">reifyGhc</a> :: (<a href="GhcMonad.html#t:Session">Session</a> -> <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a) -> <a href="GhcMonad.html#t:Ghc">Ghc</a> a</li><li class="src short"><a href="#v:getSessionDynFlags">getSessionDynFlags</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => m <a href="DynFlags.html#t:DynFlags">DynFlags</a></li><li class="src short"><a href="#v:liftIO">liftIO</a> :: <a href="MonadUtils.html#t:MonadIO">MonadIO</a> m => <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a -> m a</li><li class="src short"><span class="keyword">data</span> <a href="#t:Session">Session</a> = <a href="#v:Session">Session</a> !(<a href="IOEnv.html#t:IORef">IORef</a> <a href="HscTypes.html#t:HscEnv">HscEnv</a>)</li><li class="src short"><a href="#v:withSession">withSession</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => (<a href="HscTypes.html#t:HscEnv">HscEnv</a> -> m a) -> m a</li><li class="src short"><a href="#v:modifySession">modifySession</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => (<a href="HscTypes.html#t:HscEnv">HscEnv</a> -> <a href="HscTypes.html#t:HscEnv">HscEnv</a>) -> m ()</li><li class="src short"><a href="#v:withTempSession">withTempSession</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => (<a href="HscTypes.html#t:HscEnv">HscEnv</a> -> <a href="HscTypes.html#t:HscEnv">HscEnv</a>) -> m a -> m a</li><li class="src short"><a href="#v:logWarnings">logWarnings</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="ErrUtils.html#t:WarningMessages">WarningMessages</a> -> m ()</li><li class="src short"><a href="#v:printException">printException</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="HscTypes.html#t:SourceError">SourceError</a> -> m ()</li><li class="src short"><a href="#v:printExceptionAndWarnings">printExceptionAndWarnings</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="HscTypes.html#t:SourceError">SourceError</a> -> m ()</li><li class="src short"><span class="keyword">type</span> <a href="#t:WarnErrLogger">WarnErrLogger</a> = <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="HscTypes.html#t:SourceError">SourceError</a> -> m ()</li><li class="src short"><a href="#v:defaultWarnErrLogger">defaultWarnErrLogger</a> :: <a href="GhcMonad.html#t:WarnErrLogger">WarnErrLogger</a></li></ul></div><div id="interface"><h1 id="g:1"><code><a href="GhcMonad.html#t:Ghc">Ghc</a></code> monad stuff </h1><div class="top"><p class="src"><span class="keyword">class</span> (<a href="../base-4.5.1.0/Control-Monad.html#t:Functor">Functor</a> m, <a href="MonadUtils.html#t:MonadIO">MonadIO</a> m, <a href="Exception.html#t:ExceptionMonad">ExceptionMonad</a> m) => <a name="t:GhcMonad" class="def">GhcMonad</a> m <span class="keyword">where</span></p><div class="doc"><p>A monad that has all the features needed by GHC API calls. </p><p>In short, a GHC monad </p><ul><li> allows embedding of IO actions, </li><li> can log warnings, </li><li> allows handling of (extensible) exceptions, and </li><li> maintains a current session. </li></ul><p>If you do not use <code><a href="GhcMonad.html#t:Ghc">Ghc</a></code> or <code><a href="GhcMonad.html#t:GhcT">GhcT</a></code>, make sure to call <code><a href="GHC.html#v:initGhcMonad">initGhcMonad</a></code> before any call to the GHC API functions can occur. </p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:getSession" class="def">getSession</a> :: m <a href="HscTypes.html#t:HscEnv">HscEnv</a></p><p class="src"><a name="v:setSession" class="def">setSession</a> :: <a href="HscTypes.html#t:HscEnv">HscEnv</a> -> m ()</p></div><div class="subs instances"><p id="control.i:GhcMonad" class="caption collapser" onclick="toggleSection('i:GhcMonad')">Instances</p><div id="section.i:GhcMonad" class="show"><table><tr><td class="src"><a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> <a href="GhcMonad.html#t:Ghc">Ghc</a></td><td class="doc empty"> </td></tr><tr><td class="src">(<a href="../base-4.5.1.0/Control-Monad.html#t:Functor">Functor</a> m, <a href="Exception.html#t:ExceptionMonad">ExceptionMonad</a> m, <a href="MonadUtils.html#t:MonadIO">MonadIO</a> m) => <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> (<a href="GhcMonad.html#t:GhcT">GhcT</a> m)</td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">newtype</span> <a name="t:Ghc" class="def">Ghc</a> a </p><div class="doc"><p>A minimal implementation of a <code><a href="GhcMonad.html#t:GhcMonad">GhcMonad</a></code>. If you need a custom monad, e.g., to maintain additional state consider wrapping this monad or using <code><a href="GhcMonad.html#t:GhcT">GhcT</a></code>. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Ghc" class="def">Ghc</a></td><td class="doc empty"> </td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:unGhc" class="def">unGhc</a> :: <a href="GhcMonad.html#t:Session">Session</a> -> <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a</dt><dd class="doc empty"> </dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:Ghc" class="caption collapser" onclick="toggleSection('i:Ghc')">Instances</p><div id="section.i:Ghc" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Control-Monad.html#t:Monad">Monad</a> <a href="GhcMonad.html#t:Ghc">Ghc</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="../base-4.5.1.0/Control-Monad.html#t:Functor">Functor</a> <a href="GhcMonad.html#t:Ghc">Ghc</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="MonadUtils.html#t:MonadFix">MonadFix</a> <a href="GhcMonad.html#t:Ghc">Ghc</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="Exception.html#t:ExceptionMonad">ExceptionMonad</a> <a href="GhcMonad.html#t:Ghc">Ghc</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="MonadUtils.html#t:MonadIO">MonadIO</a> <a href="GhcMonad.html#t:Ghc">Ghc</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> <a href="GhcMonad.html#t:Ghc">Ghc</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">newtype</span> <a name="t:GhcT" class="def">GhcT</a> m a </p><div class="doc"><p>A monad transformer to add GHC specific features to another monad. </p><p>Note that the wrapped monad must support IO and handling of exceptions. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:GhcT" class="def">GhcT</a></td><td class="doc empty"> </td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:unGhcT" class="def">unGhcT</a> :: <a href="GhcMonad.html#t:Session">Session</a> -> m a</dt><dd class="doc empty"> </dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:GhcT" class="caption collapser" onclick="toggleSection('i:GhcT')">Instances</p><div id="section.i:GhcT" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Control-Monad.html#t:Monad">Monad</a> m => <a href="../base-4.5.1.0/Control-Monad.html#t:Monad">Monad</a> (<a href="GhcMonad.html#t:GhcT">GhcT</a> m)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="../base-4.5.1.0/Control-Monad.html#t:Functor">Functor</a> m => <a href="../base-4.5.1.0/Control-Monad.html#t:Functor">Functor</a> (<a href="GhcMonad.html#t:GhcT">GhcT</a> m)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="Exception.html#t:ExceptionMonad">ExceptionMonad</a> m => <a href="Exception.html#t:ExceptionMonad">ExceptionMonad</a> (<a href="GhcMonad.html#t:GhcT">GhcT</a> m)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="MonadUtils.html#t:MonadIO">MonadIO</a> m => <a href="MonadUtils.html#t:MonadIO">MonadIO</a> (<a href="GhcMonad.html#t:GhcT">GhcT</a> m)</td><td class="doc empty"> </td></tr><tr><td class="src">(<a href="../base-4.5.1.0/Control-Monad.html#t:Functor">Functor</a> m, <a href="Exception.html#t:ExceptionMonad">ExceptionMonad</a> m, <a href="MonadUtils.html#t:MonadIO">MonadIO</a> m) => <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> (<a href="GhcMonad.html#t:GhcT">GhcT</a> m)</td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:liftGhcT" class="def">liftGhcT</a> :: <a href="../base-4.5.1.0/Control-Monad.html#t:Monad">Monad</a> m => m a -> <a href="GhcMonad.html#t:GhcT">GhcT</a> m a</p></div><div class="top"><p class="src"><a name="v:reflectGhc" class="def">reflectGhc</a> :: <a href="GhcMonad.html#t:Ghc">Ghc</a> a -> <a href="GhcMonad.html#t:Session">Session</a> -> <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a</p><div class="doc"><p>Reflect a computation in the <code><a href="GhcMonad.html#t:Ghc">Ghc</a></code> monad into the <code><a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a></code> monad. </p><p>You can use this to call functions returning an action in the <code><a href="GhcMonad.html#t:Ghc">Ghc</a></code> monad inside an <code><a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a></code> action. This is needed for some (too restrictive) callback arguments of some library functions: </p><pre> libFunc :: String -> (Int -> IO a) -> IO a ghcFunc :: Int -> Ghc a ghcFuncUsingLibFunc :: String -> Ghc a -> Ghc a ghcFuncUsingLibFunc str = reifyGhc $ \s -> libFunc $ \i -> do reflectGhc (ghcFunc i) s </pre></div></div><div class="top"><p class="src"><a name="v:reifyGhc" class="def">reifyGhc</a> :: (<a href="GhcMonad.html#t:Session">Session</a> -> <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a) -> <a href="GhcMonad.html#t:Ghc">Ghc</a> a</p></div><div class="top"><p class="src"><a name="v:getSessionDynFlags" class="def">getSessionDynFlags</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => m <a href="DynFlags.html#t:DynFlags">DynFlags</a></p><div class="doc"><p>Grabs the DynFlags from the Session </p></div></div><div class="top"><p class="src"><a name="v:liftIO" class="def">liftIO</a> :: <a href="MonadUtils.html#t:MonadIO">MonadIO</a> m => <a href="../base-4.5.1.0/System-IO.html#t:IO">IO</a> a -> m a</p></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:Session" class="def">Session</a> </p><div class="doc"><p>The Session is a handle to the complete state of a compilation session. A compilation session consists of a set of modules constituting the current program or library, the context for interactive evaluation, and various caches. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Session" class="def">Session</a> !(<a href="IOEnv.html#t:IORef">IORef</a> <a href="HscTypes.html#t:HscEnv">HscEnv</a>)</td><td class="doc empty"> </td></tr></table></div></div><div class="top"><p class="src"><a name="v:withSession" class="def">withSession</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => (<a href="HscTypes.html#t:HscEnv">HscEnv</a> -> m a) -> m a</p><div class="doc"><p>Call the argument with the current session. </p></div></div><div class="top"><p class="src"><a name="v:modifySession" class="def">modifySession</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => (<a href="HscTypes.html#t:HscEnv">HscEnv</a> -> <a href="HscTypes.html#t:HscEnv">HscEnv</a>) -> m ()</p><div class="doc"><p>Set the current session to the result of applying the current session to the argument. </p></div></div><div class="top"><p class="src"><a name="v:withTempSession" class="def">withTempSession</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => (<a href="HscTypes.html#t:HscEnv">HscEnv</a> -> <a href="HscTypes.html#t:HscEnv">HscEnv</a>) -> m a -> m a</p><div class="doc"><p>Call an action with a temporarily modified Session. </p></div></div><h2 id="g:2">Warnings </h2><div class="top"><p class="src"><a name="v:logWarnings" class="def">logWarnings</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="ErrUtils.html#t:WarningMessages">WarningMessages</a> -> m ()</p><div class="doc"><p>A monad that allows logging of warnings. </p></div></div><div class="top"><p class="src"><a name="v:printException" class="def">printException</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="HscTypes.html#t:SourceError">SourceError</a> -> m ()</p><div class="doc"><p>Print the error message and all warnings. Useful inside exception handlers. Clears warnings after printing. </p></div></div><div class="top"><p class="src"><a name="v:printExceptionAndWarnings" class="def">printExceptionAndWarnings</a> :: <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="HscTypes.html#t:SourceError">SourceError</a> -> m ()</p><div class="doc"><div class="warning"><p>Deprecated: use printException instead</p></div></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:WarnErrLogger" class="def">WarnErrLogger</a> = <a href="GhcMonad.html#t:GhcMonad">GhcMonad</a> m => <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="HscTypes.html#t:SourceError">SourceError</a> -> m ()</p><div class="doc"><p>A function called to log warnings and errors. </p></div></div><div class="top"><p class="src"><a name="v:defaultWarnErrLogger" class="def">defaultWarnErrLogger</a> :: <a href="GhcMonad.html#t:WarnErrLogger">WarnErrLogger</a></p></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.11.0</p></div></body></html>