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>