<span id="mailbox-conversation"><div><div id="mb-reply">I’m +1 on this. Not only is it nice to sometimes have a non-operator (>>=) but it’s nice to have a function which more obviously lifts Kleisli arrows to monad arrows. Since it’s all aesthetics here, I think `bind f` is nice.</div></div>
<div><br></div>
<div>Bob, ap is useful with the Monad constraint because it lets you define (<*>) just using an already written Monad instance. It looks like it’s staying that way too</div>
<div><br></div>
<div>https://github.com/ghc/ghc/blob/master/libraries/base/GHC/Base.hs#L603<br></div></span><div class="mailbox_signature"><br></div>
<br><br><div class="gmail_quote"><p>On Tue, Dec 9, 2014 at 4:55 PM, Bob Ippolito <span dir="ltr"><<a href="mailto:bob@redivi.com" target="_blank">bob@redivi.com</a>></span> wrote:<br></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div dir="ltr">+1 from me, I would love to have named versions of these operators.<div><br></div>
<div>Does `ap` still have a Monad constraint or has it been changed to match the Applicative `<*>` after AMP?</div>
</div>
<div class="gmail_extra">
<br><div class="gmail_quote">On Tue, Dec 9, 2014 at 1:44 PM, Christopher Done <span dir="ltr"><<a href="mailto:chrisdone@gmail.com">chrisdone@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>
<p style="margin:1.2em 0px!important">Is this defined anywhere in base, and if not could it be placed in<br>Control.Monad? I often find myself writing:</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!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,248);background-repeat:initial initial"><span style="color:rgb(153,0,0);font-weight:bold">fmap</span> (mu bar)
     (foo zot)
</code></pre>
<p style="margin:1.2em 0px!important">Then I decide to change the type of <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">x</code>, so instead I want to just<br>write:</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!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,248);background-repeat:initial initial"><span style="color:rgb(153,0,0);font-weight:bold">bind</span> (mu bar)
     (foo zot)
</code></pre>
<p style="margin:1.2em 0px!important">Which is just like <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">fmap</code> but the function can run in the<br>monad. Similar to traverse:</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!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,248);background-repeat:initial initial">(<span style="color:rgb(68,85,136);font-weight:bold">Traversable</span> t, <span style="color:rgb(68,85,136);font-weight:bold">Applicative</span> f) => (a -> f b) -> t a -> f (t b)
</code></pre>
<p style="margin:1.2em 0px!important">As someone who isn’t a fan of operators, I generally am appreciative<br>of alternative regular plain English word versions of functions, which<br>I find easier to type, read and edit. Currently without defining such<br>a handy name, I have to transform the code to this:</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!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,248);background-repeat:initial initial"><span style="color:rgb(153,0,0);font-weight:bold">mu</span> bar =<<
<span style="color:rgb(153,0,0);font-weight:bold">foo</span> zot
</code></pre>
<p style="margin:1.2em 0px!important">The name for this function is a no-brainer:</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!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,248);background-repeat:initial initial"><span style="color:rgb(153,0,0);font-weight:bold">bind</span> :: <span style="color:rgb(68,85,136);font-weight:bold">Monad</span> m => (a -> m b) -> m a -> m b
<span style="color:rgb(153,0,0);font-weight:bold">bind</span> = (=<<)
</code></pre>
<p style="margin:1.2em 0px!important">For comparison, the not-very-pleasant <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"><$></code> and <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"><*></code> each have word<br>alternatives, <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">fmap</code> and <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">ap</code>. Even <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"><></code> has <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">mappend</code>.</p>
<p style="margin:1.2em 0px!important">I don’t hold much hope for this, Haskellers love operators as much as<br>Perl programmers so few on this list will see the value in plain old<br>words, but at least I can link to this email in the archives for<br>future reference.</p>
<p style="margin:1.2em 0px!important">Ciao</p>
<div title="MDH:PGRpdj5JcyB0aGlzIGRlZmluZWQgYW55d2hlcmUgaW4gYmFzZSwgYW5kIGlmIG5vdCBjb3VsZCBp
dCBiZSBwbGFjZWQgaW48L2Rpdj48ZGl2PkNvbnRyb2wuTW9uYWQ/IEkgb2Z0ZW4gZmluZCBteXNl
bGYgd3JpdGluZzo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYCBoYXNrZWxsPC9kaXY+PGRp
dj5mbWFwIChtdSBiYXIpPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwOyhmb28gem90KTwv
ZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGVuIEkgZGVjaWRlIHRvIGNo
YW5nZSB0aGUgdHlwZSBvZiBgeGAsIHNvIGluc3RlYWQgSSB3YW50IHRvIGp1c3Q8L2Rpdj48ZGl2
PndyaXRlOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgIGhhc2tlbGw8L2Rpdj48ZGl2PmJp
bmQgKG11IGJhcik8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7KGZvbyB6b3QpPC9kaXY+
PGRpdj5gYGA8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PldoaWNoIGlzIGp1c3QgbGlrZSBgZm1h
cGAgYnV0IHRoZSBmdW5jdGlvbiBjYW4gcnVuIGluIHRoZTwvZGl2PjxkaXY+bW9uYWQuIFNpbWls
YXIgdG8gdHJhdmVyc2U6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5gYGAgaGFza2VsbDwvZGl2
PjxkaXY+KFRyYXZlcnNhYmxlIHQsIEFwcGxpY2F0aXZlIGYpID0mZ3Q7IChhIC0mZ3Q7IGYgYikg
LSZndDsgdCBhIC0mZ3Q7IGYgKHQgYik8L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+QXMgc29tZW9uZSB3aG8gaXNuJ3QgYSBmYW4gb2Ygb3BlcmF0b3JzLCBJIGdlbmVyYWxs
eSBhbSBhcHByZWNpYXRpdmU8L2Rpdj48ZGl2Pm9mIGFsdGVybmF0aXZlIHJlZ3VsYXIgcGxhaW4g
RW5nbGlzaCB3b3JkIHZlcnNpb25zIG9mIGZ1bmN0aW9ucywgd2hpY2g8L2Rpdj48ZGl2PkkgZmlu
ZCBlYXNpZXIgdG8gdHlwZSwgcmVhZCBhbmQgZWRpdC4gQ3VycmVudGx5IHdpdGhvdXQgZGVmaW5p
bmcgc3VjaDwvZGl2PjxkaXY+YSBoYW5keSBuYW1lLCBJIGhhdmUgdG8gdHJhbnNmb3JtIHRoZSBj
b2RlIHRvIHRoaXM6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5gYGAgaGFza2VsbDwvZGl2Pjxk
aXY+bXUgYmFyID0mbHQ7Jmx0OzwvZGl2PjxkaXY+Zm9vIHpvdDwvZGl2PjxkaXY+YGBgPC9kaXY+
PGRpdj48YnI+PC9kaXY+PGRpdj5UaGUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyBhIG5vLWJy
YWluZXI6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5gYGAgaGFza2VsbDwvZGl2PjxkaXY+Ymlu
ZCA6OiBNb25hZCBtID0mZ3Q7IChhIC0mZ3Q7IG0gYikgLSZndDsgbSBhIC0mZ3Q7IG0gYjwvZGl2
PjxkaXY+YmluZCA9ICg9Jmx0OyZsdDspPC9kaXY+PGRpdj5gYGA8L2Rpdj48ZGl2Pjxicj48L2Rp
dj48ZGl2PkZvciBjb21wYXJpc29uLCB0aGUgbm90LXZlcnktcGxlYXNhbnQgYCZsdDskJmd0O2Ag
YW5kIGAmbHQ7KiZndDtgIGVhY2ggaGF2ZSB3b3JkPC9kaXY+PGRpdj5hbHRlcm5hdGl2ZXMsIGBm
bWFwYCBhbmQgYGFwYC4gRXZlbiBgJmx0OyZndDtgIGhhcyBgbWFwcGVuZGAuPC9kaXY+PGRpdj48
YnI+PC9kaXY+PGRpdj5JIGRvbid0IGhvbGQgbXVjaCBob3BlIGZvciB0aGlzLCBIYXNrZWxsZXJz
IGxvdmUgb3BlcmF0b3JzIGFzIG11Y2ggYXM8L2Rpdj48ZGl2PlBlcmwgcHJvZ3JhbW1lcnMgc28g
ZmV3IG9uIHRoaXMgbGlzdCB3aWxsIHNlZSB0aGUgdmFsdWUgaW4gcGxhaW4gb2xkPC9kaXY+PGRp
dj53b3JkcywgYnV0IGF0IGxlYXN0IEkgY2FuIGxpbmsgdG8gdGhpcyBlbWFpbCBpbiB0aGUgYXJj
aGl2ZXMgZm9yPC9kaXY+PGRpdj5mdXR1cmUgcmVmZXJlbmNlLjwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+Q2lhbzwvZGl2Pg==" style="min-height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div>
</div></div>
<br>_______________________________________________<br>
Libraries mailing list<br><a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br><a href="http://www.haskell.org/mailman/listinfo/libraries">http://www.haskell.org/mailman/listinfo/libraries</a><br><br></blockquote>
</div>
<br></div>
</blockquote></div><br>