<div dir="ltr"><div></div><div class="markdown-here-wrapper" style><p style="margin:1.2em 0px!important">I propose to add the following utility function into <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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">Control.Applicative</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);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,255)">cond :: (Alternative f) => (a -> Bool) -> a -> f a
cond p a = if p a then pure a else empty
</code></pre><p style="margin:1.2em 0px!important">Following is a typical use case:</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);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,255)">\x -> fromMaybe 0 $ cond (> 0) $ x - 10
</code></pre><p style="margin:1.2em 0px!important">which is the same as</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);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,255)">\x -> let y = x - 10 in if y > 0 then y else 0
</code></pre><p style="margin:1.2em 0px!important">Why the first one is better:</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px"><p style="margin:1.2em 0px!important;margin:0.5em 0px!important">The control flow is evident and goes from right to left step by step.<br>It’s not scattered around like in the second example.</p>
</li>
<li style="margin:0.5em 0px"><p style="margin:1.2em 0px!important;margin:0.5em 0px!important">No need to interrupt to imagine a name for a temporary variable.</p>
</li><li style="margin:0.5em 0px"><p style="margin:1.2em 0px!important;margin:0.5em 0px!important">Less noise.</p></li>
</ol>
<p style="margin:1.2em 0px!important">Now, since it’s generalised to <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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">Alternative</code> one can imagine tons of other useful cases for this.</p>
<p style="margin:1.2em 0px!important">Alternative titles:</p>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px"><p style="margin:1.2em 0px!important;margin:0.5em 0px!important"><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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">conditional</code></p>
</li>
<li style="margin:0.5em 0px"><p style="margin:1.2em 0px!important;margin:0.5em 0px!important"><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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">partial</code></p>
</li>
</ul>
<p style="margin:1.2em 0px!important">Best regards,<br>Nikita</p>
<div title="MDH:PGRpdj5JIHByb3Bvc2UgdG8gYWRkIHRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbiBpbnRv
IGBDb250cm9sLkFwcGxpY2F0aXZlYDo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYDwvZGl2
PjxkaXY+Y29uZCA6OiAoQWx0ZXJuYXRpdmUgZikgPSZndDsgKGEgLSZndDsgQm9vbCkgLSZndDsg
YSAtJmd0OyBmIGE8L2Rpdj48ZGl2PmNvbmQgcCBhID0gaWYgcCBhIHRoZW4gcHVyZSBhIGVsc2Ug
ZW1wdHk8L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Rm9sbG93aW5nIGlz
IGEgdHlwaWNhbCB1c2UgY2FzZTo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYDwvZGl2Pjxk
aXY+XHggLSZndDsgZnJvbU1heWJlIDAgJCBjb25kICgmZ3Q7IDApICQgeCAtIDEwPC9kaXY+PGRp
dj5gYGA8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PndoaWNoIGlzIHRoZSBzYW1lIGFzPC9kaXY+
PGRpdj48YnI+PC9kaXY+PGRpdj5gYGA8L2Rpdj48ZGl2Plx4IC0mZ3Q7IGxldCB5ID0geCAtIDEw
IGluIGlmIHkgJmd0OyAwIHRoZW4geSBlbHNlIDA8L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+V2h5IHRoZSBmaXJzdCBvbmUgaXMgYmV0dGVyOjwvZGl2PjxkaXY+PGJyPjwv
ZGl2PjxkaXY+MS4gVGhlIGNvbnRyb2wgZmxvdyBpcyBldmlkZW50IGFuZCBnb2VzIGZyb20gcmln
aHQgdG8gbGVmdCBzdGVwIGJ5IHN0ZXAuJm5ic3A7PC9kaXY+PGRpdj5JdCdzIG5vdCBzY2F0dGVy
ZWQgYXJvdW5kIGxpa2UgaW4gdGhlIHNlY29uZCBleGFtcGxlLjwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+Mi4gTm8gbmVlZCB0byBpbnRlcnJ1cHQgdG8gaW1hZ2luZSBhIG5hbWUgZm9yIGEgdGVt
cG9yYXJ5IHZhcmlhYmxlLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Tm93LCBzaW5jZSBpdCdz
IGdlbmVyYWxpc2VkIHRvIGBBbHRlcm5hdGl2ZWAgb25lIGNhbiBpbWFnaW5lIHRvbnMgb2Ygb3Ro
ZXIgdXNlZnVsIGNhc2VzIGZvciB0aGlzLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+QWx0ZXJu
YXRpdmUgdGl0bGVzOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+KiBgY29uZGl0aW9uYWxgPC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj4qIGBwYXJ0aWFsYDwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk
aXY+QmVzdCByZWdhcmRzLDwvZGl2PjxkaXY+TmlraXRhPC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div><div></div></div>