[Haskell-cafe] Nested Monads Questions
Chris Kuklewicz
haskell at list.mightyreason.com
Sat Aug 12 05:07:01 EDT 2006
Bulat Ziganshin wrote:
> Hello Chris,
>
> Saturday, August 12, 2006, 4:05:44 AM, you wrote:
>
>> Nine Base Monads:
>> IO STM ST ST.Lazy GenParser [] Maybe Either (->)
>
>> Seven MonadTrans:
>> ListT ContT ErrorT ReaderT StateT WriterT RWST
>
> i'm not sure, but isn't Id monad also required for completeness?
>
Yes, Identity is required for completeness. And I have added to
http://haskell.org/haskellwiki/NewMonads#MonadBase this definition:
> -- One can recover MonadIO and liftIO from MonadBase
> class (MonadBase IO m) => MonadIO' m where
> liftIO' :: IO a -> m a
> liftIO' = liftBase
Of course, the above is unneeded since you can always write liftBase instead of
liftIO.
>...
> at least it's included in MonadLib by Iavor S. Diatchki:
> http://www.csee.ogi.edu/~diatchki/monadLib/monadLib-2.0.tar.gz
>
Hah...I knew someone else had done this. Also, there is 2.0.1 version of
monadLib at http://www.cse.ogi.edu/~diatchki/monadLib/
His version is called BaseM, and uses a fundep:
> -- | Provides means to execute a computation in the base of a tower of monads.
> class (Monad m, Monad b) => BaseM m b | m -> b where
> inBase :: b a -> m a
>
> instance BaseM IO IO where inBase x = x
> instance BaseM [] [] where inBase x = x
> instance BaseM Maybe Maybe where inBase x = x
>
I am not sure I like the "inBase" name. I think "fromBase" might be a better
match to its type. The "inBase" seems more like "toBase" which is backwards.
My small test did not need the fundep, and I wonder if there is some creative
example that shows either that the fundep is useful or a counter example that
shows something very very clever that would otherwise violate the fundep.
I *might* be able to imagine a transformer stack that pretends to have different
base monads.
> am i correctly understand that your module is update on Monad
> transformers lib already included in GHC?
Essentially, that is exactly what it is. It completely replaces MonadIO.
--
Chris
More information about the Haskell-Cafe
mailing list