For monads like StateT, WriterT, ReaderT, the order doesn&#39;t matter (except perhaps for some pesky performance details). However, for monad transformers like ErrorT or ListT, the order _does_ matter.<br><br>The code you have there is perfectly fine, sometimes the added generality can be quite handy (especially if you have your own MonadState&#39;esk type classes). <br>
The two major drawbacks to this approach (that I can think of off the top of my head) are:<br>1) Rather large and complicated contexts on quite a few of your functions <br>2) Can lead to nearly indecypherable error messages<br>
<br>Personally, I try to avoid multiparameter typeclasses whenever possible; I&#39;ve found them to be more trouble than they are worth.<br><br>My advice would be to leave the code general if the code actually does something general (it actually has more than one use case) and give the code a fixed signature if the code really one has just one purpose (even if ghci can infer a general type for you).<br>
This is just a personal preference, but it seems to work well for me :)<br><br>- Job<br><br><br><div class="gmail_quote">On Mon, Aug 9, 2010 at 3:05 PM, aditya siram <span dir="ltr">&lt;<a href="mailto:aditya.siram@gmail.com">aditya.siram@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi all,<br>I was experimenting with monad transformers and realized that the stacking order of the monads can remain unknown until it is used. Take for example the following code:<br>
<br><span style="font-family: courier new,monospace;">import &quot;mtl&quot; Control.Monad.State</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">import &quot;mtl&quot; Control.Monad.Writer</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">import &quot;mtl&quot; Control.Monad.Identity</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">test :: (MonadWriter [Char] m, Num t, MonadState t m) =&gt; m ()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">test = do</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">     put 1</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">     tell &quot;hello&quot;</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">main = do</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">     x &lt;- return $ runIdentity $ runStateT (runWriterT test) 1 -- test :: WriterT String (StateT Int Identity)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">     y &lt;- return $ runIdentity $ runWriterT $ runStateT test 1 -- test :: StateT Int (WriterT String Identity)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">     z &lt;- runWriterT $ runStateT test 1                        -- test :: StateT Int (WriterT String IO) </span>(((), Int), String)<br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">     print x</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">     print y       </span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">     print z</span><br><br>*Main&gt; main<br>(((),&quot;hello&quot;),1)<br>(((),1),&quot;hello&quot;)<br>(((),1),&quot;hello&quot;)<br><br>Until test is called in &#39;main&#39; we don&#39;t know the order of monads. In fact even the base monad is not know. All we know is that it uses the State and Writer monad. In each call to &#39;test&#39; in main we can determine the stacking order and the base monad yielding different results. This seems to be a more flexible way of using monad transformers but I haven&#39;t seen this in code before so is there anything wrong with this style?<br>

<br>-deech<br>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>