<div dir="ltr"><div class="markdown-here-wrapper" style><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 class="hljs 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!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 class="hljs-title" 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 class="hljs 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!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 class="hljs-title" 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 class="hljs 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!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 class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Traversable</span> t, <span class="hljs-type" 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 class="hljs 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!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 class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">mu</span> bar =<<
<span class="hljs-title" 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 class="hljs 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!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 class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">bind</span> :: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Monad</span> m => (a -> m b) -> m a -> m b
<span class="hljs-title" 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="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>