
On Tue, Nov 03, 2009 at 06:29:46PM -0800, Michael Mossey wrote:
How does one consider the best ordering of monad transformers? For example, if I'm combining ErrorT, StateT (or State), and WriterT (or Writer)? But not just this specific example---what principles can one consult to determine ordering?
As Stephen has illustrated, the principle is that the effects of _inner_ transformers can "override" the effects of _outer_ transformers. (This has often seemed unintuitive and "backwards" to me, but that's the way it is.) For example, consider StateT s (FooT ...): if FooT has a failure mode, when a computation fails you don't even get a state anymore. Or if FooT has some sort of backtracking effect, the state will get rewound along with the rest of the computation. On the other hand, FooT (StateT s ....) will still compute a state even when the FooT fails, and the state will be preserved even when the computation backtracks. -Brent