<div dir="ltr"><div class="gmail_default" style="font-family:'courier new',monospace"></div><div class="markdown-here-wrapper" id="markdown-here-wrapper-99585" style><p style="margin:1.2em 0px!important">So you have some particular <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">t</code>s for which you wish to provide a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">MonadReader</code> instance?</p>

<p style="margin:1.2em 0px!important">In that case for each <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">t</code> which lacks <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">MonadReader</code> instance (look <a href="http://hackage.haskell.org/package/mtl-2.1.2/docs/Control-Monad-Reader-Class.html#t:MonadReader">here</a> for existing instances) you need to implement it:</p>

<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="language-haskell" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;white-space:pre;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,255);background-repeat:initial initial"><span class="class" style="color:rgb(68,85,136);font-weight:bold"><span class="keyword" style="color:rgb(51,51,51);font-weight:bold">instance</span> <span class="type">MonadReader</span> r m => <span class="type">MonadReader</span> r (t m) <span class="keyword" style="color:rgb(51,51,51);font-weight:bold">where</span></span>
    ask = lift ask
    local = ...</code></pre>
<p style="margin:1.2em 0px!important">The way to implement <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">local</code> is individual for each <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">t</code>, so you might want to specify which transformers are you working with.</p>

<p style="margin:1.2em 0px!important">Nick</p>
</div><div class="gmail_default" style="font-family:'courier new',monospace"></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/11/1 David Fox <span dir="ltr"><<a href="mailto:dsf@seereason.com" target="_blank">dsf@seereason.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I mean m, not M.</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">
On Thu, Oct 31, 2013 at 3:54 PM, David Fox <span dir="ltr"><<a href="mailto:dsf@seereason.com" target="_blank">dsf@seereason.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">Hmm, I'm still having trouble implementing local for the MonadReader instance of M.</div><div>
<div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Oct 31, 2013 at 11:59 AM, Nickolay Kudasov <span dir="ltr"><<a href="mailto:nickolay.kudasov@gmail.com" target="_blank">nickolay.kudasov@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 class="gmail_default" style="font-family:courier new,monospace"></div><div><p style="margin:1.2em 0px!important">


Hi David,</p>
<p style="margin:1.2em 0px!important">I believe the easiest way to do what you want is to use <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">MonadReader</code> class instead of explicit <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">t (Reader [String] a)</code>:</p>




<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;white-space:pre-wrap;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,255);background-repeat:initial initial"><span style="color:rgb(153,0,0);font-weight:bold">push'</span> :: <span>MonadReader</span> [<span>String</span>] m => <span>String</span> -> m a -> m a
<span style="color:rgb(153,0,0);font-weight:bold">push'</span> s = local (s:)</code></pre>
<p style="margin:1.2em 0px!important">Best,<br>Nick</p>
</div><div class="gmail_default" style="font-family:courier new,monospace"></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/10/31 David Fox <span dir="ltr"><<a href="mailto:dsf@seereason.com" target="_blank">dsf@seereason.com</a>></span><br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr">I can write a stack push function in the reader monad like so:<div><br></div><div>
<div>    import Control.Monad.Reader</div>
<div><br></div><div>    push :: String -> Reader [String] a ->  Reader [String] a</div>
<div>    push s action = local (s :) action</div><div><br></div><div>How can I write a push that works inside a monad transformer?</div><div><br></div><div>    push' :: MonadTrans t => String -> t (Reader [String]) a ->  t (Reader [String]) a</div>




<div>    push' s action = ???</div><div><br></div></div></div>
<br></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://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>