I&#39;m enjoying writing code that uses the Error monad to provide errors, which I can catch and rethrow to add context. Kind of like getting a stack trace with any context I want every time an error happens.<br><br>In most cases I use monad transformers, so the actual monad type would be something like &quot;ErrorT String (State Int) a&quot;<br>
<br>But much of my code that handles errors doesn&#39;t need to know the entire context. It uses throwError, but otherwise doesn&#39;t care anything else about the type of the monadic computation. I.e., it needs to &quot;know&quot; that it&#39;s inside a monadic computation of a typeclass MonadError.<br>
<br>So I discovered that I could declare a function like this:<br><br>x :: MonadError String m =&gt; Float -&gt; m Float<br>x y = if y == 0 <br>  then throwError &quot;zero&quot;<br>  else return y<br><br>My awareness of class constraints is vague, so as I worked on this problem I knew in a fuzzy way it was going to look something like that, but I had to experiment.<br>
<br>Also, because I put &quot;String&quot; in the class constraint, I need to turn on FlexibleContexts.<br><br>So my question is, how would I do it without making &quot;String&quot; explicit?<br><br>If I put<br><br>x:: MonadError e m =&gt; Float -&gt; m Float<br>
x y = if y == 0 <br>
  then throwError &quot;zero&quot;<br>
  else return y<br><br>I get errors saying &quot;couldn&#39;t match expected type e against inferred type [Char]&quot; and something about functional dependencies<br><br>I fiddled with it a bit but couldn&#39;t make it work.<br>