<div dir="ltr">Here's a pretty elegant (read: hacky?) way of working with RebindableSyntax:<div><br></div><div>=== Foo.hs</div><div><div>module Foo where</div><div><br></div><div>import Prelude hiding (Monad (..))</div><div>import qualified Prelude as P</div><div><br></div><div>data MyMonad m a b = MyMonad</div><div>  { (>>=)  :: m a -> (a -> m b) -> m b</div><div>  , (>>)   :: m a -> m b -> m b</div><div>  , return :: a -> m a</div><div>  , fail   :: String -> m a</div><div>  }</div><div><br></div><div>ioMonad :: MyMonad IO a b</div><div>ioMonad = MyMonad (P.>>=) (P.>>) P.return P.fail</div></div><div><br></div><div>=== Bar.hs</div><div><div>{-# OPTIONS -fno-warn-name-shadowing #-}</div><div>{-# LANGUAGE RecordWildCards #-}</div><div>{-# LANGUAGE RebindableSyntax #-}</div><div>module Bar where</div><div><br></div><div>import Prelude</div><div>import qualified Foo</div><div><br></div><div><div>normalDo :: Monad m => m ()</div><div>normalDo = do</div><div>  return ()</div></div><div><br></div><div>-- Inferred: ioDo :: IO ()</div><div>ioDo = do</div><div>  return ()</div><div>  where Foo.MyMonad{..} = Foo.ioMonad</div></div><div><br></div><div>Cheers,</div><div>Adam</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 22, 2015 at 9:19 PM, Mark Roberts <span dir="ltr"><<a href="mailto:markandrusroberts@gmail.com" target="_blank">markandrusroberts@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Ah, I missed that bit. Thank you!<span class="HOEnZb"><font color="#888888"><br></font></span></div><span class="HOEnZb"><font color="#888888">Mark<br></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 22, 2015 at 12:18 PM, Erik Hesselink <span dir="ltr"><<a href="mailto:hesselink@gmail.com" target="_blank">hesselink@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Mark,<br>
<br>
RebindableSyntax uses whatever (>>), (>>=) and return are in scope. So<br>
if you bind them in a `let` or `where`, you should be able to use<br>
different ones for different do blocks.<br>
<span><font color="#888888"><br>
Erik<br>
</font></span><div><div><br>
On Mon, Jun 22, 2015 at 8:39 PM, Mark Roberts<br>
<<a href="mailto:markandrusroberts@gmail.com" target="_blank">markandrusroberts@gmail.com</a>> wrote:<br>
> I have a program that uses both monads and indexed monads, and I'd like to<br>
> use do-notation for each in the same source file. Is there a way to rebind<br>
> syntax for only the do blocks that make use of an indexed monad?<br>
><br>
> Thanks,<br>
> Mark<br>
><br>
</div></div><div><div>> _______________________________________________<br>
> Haskell-Cafe mailing list<br>
> <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
><br>
</div></div></blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>