<div dir="ltr"><div class="gmail_default"><font face="arial, helvetica, sans-serif">Hi Dmitry,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Perhaps you just want monad transformers [1, 2]. If you're not familiar with them, you should probably read [3].</font></div>
<div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">With transformers you'd be able to do this (and more):</font></div>
<div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">$ return 2 :: IO Int</div><div class="gmail_default" style="font-family:'courier new',monospace">
$ return 2 :: ListT Maybe Int   -- this works like Maybe [Int]</div><div class="gmail_default" style="font-family:'courier new',monospace">$ return 2 :: MaybeT [] Int     -- this works like [Maybe Int]</div><div class="gmail_default" style="font-family:'courier new',monospace">
<br></div><div class="gmail_default" style="font-family:'courier new',monospace">$ runListT $ return 2 :: Maybe [Int]</div><div class="gmail_default" style="font-family:'courier new',monospace">Just [2]</div>
<div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">[1] <a href="http://hackage.haskell.org/package/transformers" style="font-family:arial">http://hackage.haskell.org/package/transformers</a></div>
<div class="gmail_default" style="font-family:'courier new',monospace">[2] <a href="http://hackage.haskell.org/package/mtl" style="font-family:arial">http://hackage.haskell.org/package/mtl</a></div><div class="gmail_default" style="font-family:'courier new',monospace">
[3] <a href="http://web.cecs.pdx.edu/~mpj/pubs/springschool.html" style="font-family:arial">http://web.cecs.pdx.edu/~mpj/pubs/springschool.html</a></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/11/23 Dmitry Bogatov <span dir="ltr"><<a href="mailto:KAction@gnu.org" target="_blank">KAction@gnu.org</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Hi, list!<br>
<br>
I want to write function, that will stack `return` as much times, as<br>
necessery. In code, I want<br>
<$> magicLift 2 :: IO Int<br>
<$> magicLift 2 :: Maybe [Int]<br>
both be valid.<br>
<br>
My best approach is following (not work)<br>
<br>
    {-# LANGUAGE FlexibleInstances #-}<br>
    {-# LANGUAGE UndecidableInstances #-}<br>
<br>
    class Monad m => MonadS m where<br>
        liftS :: a -> m a<br>
<br>
    instance (Monad m) => MonadS m where<br>
        liftS = return<br>
<br>
but<br>
<$> :t liftS 2<br>
liftS 2 :: (Monad m, Num a) => m a<br>
<br>
What would you suggest?<br>
<br>
--<br>
Best regards, Dmitry Bogatov <<a href="mailto:KAction@gnu.org">KAction@gnu.org</a>>,<br>
Free Software supporter and netiquette guardian.<br>
        git clone git://<a href="http://kaction.name/rc-files.git" target="_blank">kaction.name/rc-files.git</a> --depth 1<br>
        GPG: 54B7F00D<br>
Html mail and proprietary format attachments are forwarded to /dev/null.<br>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>