<div>Also, I didn&#39;t realize this at first, but in order to use any of the MonadTrans instances, like having StateT s (Prompt p) automatically be a MonadPrompt, you sadly also need &quot;-fallow-overlapping-instances&quot;.
</div>
<div>&nbsp;</div>
<div>This is because MonadTrans monads&nbsp;looks a lot like Prompt.</div>
<div>&nbsp;</div>
<div>arbitrary MonadTrans monad:</div>
<div>&nbsp; t (m :: * -&gt; *) (a :: *)</div>
<div>Prompt:</div>
<div>&nbsp; Prompt (p :: * -&gt; *) (a :: *)</div>
<div>&nbsp;</div>
<div>Since you&nbsp;can substitute &quot;Prompt&quot; for t and rename m to p, they look like they match the some of the same types to the compiler.&nbsp; However, since Prompt won&#39;t ever be declared as an instance of&nbsp;MonadTrans, the overlap is safe.
</div>
<div>&nbsp;</div>
<div>The alternative is to declare all the instances you need manually:</div>
<div>&nbsp;</div>
<div>instance MonadPrompt p (StateT s (Prompt p)) where prompt = lift . prompt</div>
<div>-- etc.</div>
<div>&nbsp;</div>
<div>&nbsp; -- ryan<br>&nbsp;</div>