[Haskell-cafe] Stacked return
nickolay.kudasov at gmail.com
Sat Nov 23 17:49:58 UTC 2013
You could perhaps write MyWierdMonadT and MyAnotherMonadT.
Also, probably layers package  is related to what you ask.
But if you actually want arbitrary nested monads like m1 (m2 (m3 (m4 a))),
there's no simple way.
Consider Maybe [MyType Int]. MyType may have or may not have a
Monadinstance. Even more: it can have instance in one module, but not
another. But suppose MyType has a Num instance. Then how this should
2 :: Maybe [MyType Int]? Should 2 be of type Int or MyType Int?
Note that you can make an instance Num a => Num [a] which makes sense
(lists as polynoms). So the same question arises even for Maybe [Int].
If you **really want to do it** (which I doubt), you can use TH (do
determine how many return's to use, though it's ambiguous anyway).
2013/11/23 Dmitry Bogatov <KAction at gnu.org>
> > Perhaps you just want monad transformers [1, 2]. If you're not familiar
> > with them, you should probably read .
> > With transformers you'd be able to do this (and more):
> > $ return 2 :: IO Int
> > $ return 2 :: ListT Maybe Int -- this works like Maybe [Int]
> > $ return 2 :: MaybeT  Int -- this works like [Maybe Int]
> In fact, I read and used transformers a bit. If I understand correctly,
> I can only do such things for monads, supported by transformers. So,
> I cant get (return 2) :: MyWierdMonad (MyAnotherMonad 2)
> Yes, I know, it have little practical use, but I am insterested about
> teoretical part of question, magic of ghc.
> Best regards, Dmitry Bogatov <KAction at gnu.org>,
> Free Software supporter and netiquette guardian.
> git clone git://kaction.name/rc-files.git --depth 1
> GPG: 54B7F00D
> Html mail and proprietary format attachments are forwarded to /dev/null.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe