[Haskell-cafe] Monads and scope
Brandon Allbery
allbery.b at gmail.com
Tue Nov 4 03:15:20 UTC 2014
On Mon, Nov 3, 2014 at 10:02 PM, Jeffrey Brown <jeffbrown.the at gmail.com>
wrote:
> *Question 1: Are monad stacks "transparent" -- that is, can one use a
> layer in the middle of a monad stack without thinking about other layers?*
>
> In learning about how to stack multiple monads (or more literally, how to
> stack monad transformers on top of a monad), I was expecting that in order
> to reach into the middle of the stack, one would have to stay aware of the
> order in which the stack was created, and unwrap outer transformers to get
> there.
>
If you're doing it manually, yes, that would be true. Newtype deriving can
be used to hide it, assuming that the levels are distinct enough: you can't
easily pick between two MonadReader-s, for example, without lifting past
one of them (and therefore having to at least know what order they are in).
Is that true in general? That is, if I build on top of a monad M a stack of
> monad transformers T1 T2 T3 ... TN M, and each of the Tn have different
> functions associated with them, call I call those functions without even
> remembering the order in which the transformers were stacked? Does the
> order of the stack constrain the programmer in how they chain execution
> functions like runReader, but not otherwise?
>
If you use newtype deriving, you can mostly avoid depth or ordering. One
remaining sticky case is that of `fail`; if a monad in the middle calls
`fail`, state below that monad *may* be lost. (But `fail` is rather badly
behaved in general, and is best avoided.)
Stated differently: Monadic code can call pure code. Can pure code ever
> call monadic code?
>
Something like runReaderT or runST? Or in the extreme case, unsafePerformIO
--- which is unsafe for a reason, and trying to use it to sneak into IO
from pure code will usually cause major problems, because pure code does
not expect non-deterministic results. Otherwise, the type system does its
best to avoid you unexpectedly dipping into e.g. IO from inside pure code.
--
brandon s allbery kf8nh sine nomine associates
allbery.b at gmail.com ballbery at sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20141103/caf2b43e/attachment.html>
More information about the Haskell-Cafe
mailing list