haskell - Is there a better way than writing `lift`s before each `IO` in a nested `MonadTrans`? -


sometimes need use several nested monadtrans. example, put maybet inside of exceptt, mimick continue , break in imperative programming:

runexceptt . form [1..] $ \ _ -> runmaybet $     ...     mzero   -- mimics continue     lift $ throwe "..."    -- mimics break     lift . lift $ putstrln "hello!"     ... 

however, above code shows, every time need io inside of "artificial loop", need put ugly lift . lift before it. imagine if have more complicated nestings, , lot of io operations, becomes anonyance. how make code cleaner , more concise?

for particular case of io, can use liftio :: monadio m => io -> m a lift io action through arbitrarily deep monad transformer stack:

liftio $ putstrln "hello" 

this expression has type monadio m => m (). transformer stack contains instance of monadio somewhere inside of should have monadio instance itself, why works stack of depth.


Comments

Popular posts from this blog

javascript - Chart.js (Radar Chart) different scaleLineColor for each scaleLine -

apache - Error with PHP mail(): Multiple or malformed newlines found in additional_header -

java - Android – MapFragment overlay button shadow, just like MyLocation button -