https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112018-01-24T09:11:34ZRuby Issue Tracking SystemRuby master - Feature #11161: Proc/Method#rcurry working like curry but in reverse orderhttps://bugs.ruby-lang.org/issues/11161?journal_id=697522018-01-24T09:11:34Zzverok (Victor Shepelev)zverok.offline@gmail.com
<ul></ul><p>Started to write my own ticket, but found this one :)</p>
<p>My explanation was like this:</p>
<hr>
<p>Considering two widespread Ruby patterns:</p>
<ul>
<li>Last method arguments are frequently options/settings/clarifications of the call;</li>
<li>
<code>Method#to_proc</code> as a useful idiom for function-style programming...</li>
</ul>
<p>I thought about constructs like this (some hate them, but not me):</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">URLS</span><span class="p">.</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">Faraday</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:get</span><span class="p">)).</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">JSON</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:parse</span><span class="p">))</span>
</code></pre>
<p>For me, it seems pretty useful to be able to do this:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">URLS</span><span class="p">.</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">Faraday</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:get</span><span class="p">).</span><span class="nf">rcurry</span><span class="p">[</span><span class="ss">some_get_param: </span><span class="s1">'value'</span><span class="p">]).</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">JSON</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:parse</span><span class="p">).</span><span class="nf">rcurry</span><span class="p">[</span><span class="ss">symbolize_names: </span><span class="kp">true</span><span class="p">])</span>
</code></pre>
<p>Of course, you can say that it makes you eyes bleed.... But I somehow love what we can get this way.</p>
<p>Can we please consider it for next Ruby version?</p> Ruby master - Feature #11161: Proc/Method#rcurry working like curry but in reverse orderhttps://bugs.ruby-lang.org/issues/11161?journal_id=720702018-05-17T06:39:31Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/72070/diff?detail_id=49109">diff</a>)</li></ul> Ruby master - Feature #11161: Proc/Method#rcurry working like curry but in reverse orderhttps://bugs.ruby-lang.org/issues/11161?journal_id=720742018-05-17T06:47:59Zakr (Akira Tanaka)akr@fsij.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li></ul><p>We discussed this issue at DevelopersMeeting20180517Japan [Misc <a class="issue tracker-5 status-5 priority-4 priority-default closed" title="Misc: DevelopersMeeting20180517Japan (Closed)" href="https://bugs.ruby-lang.org/issues/14698">#14698</a>].</p>
<p>It needs better (practical) usages to show usefulness of this proposal.</p> Ruby master - Feature #11161: Proc/Method#rcurry working like curry but in reverse orderhttps://bugs.ruby-lang.org/issues/11161?journal_id=721132018-05-17T09:49:09Zzverok (Victor Shepelev)zverok.offline@gmail.com
<ul></ul><blockquote>
<p>It needs better (practical) usages to show usefulness of this proposal.</p>
</blockquote>
<p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/271">@akr (Akira Tanaka)</a> I believe the code in my comment provides the justification:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">URLS</span><span class="p">.</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">Faraday</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:get</span><span class="p">).</span><span class="nf">rcurry</span><span class="p">[</span><span class="ss">some_get_param: </span><span class="s1">'value'</span><span class="p">]).</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">JSON</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:parse</span><span class="p">).</span><span class="nf">rcurry</span><span class="p">[</span><span class="ss">symbolize_names: </span><span class="kp">true</span><span class="p">])</span>
</code></pre>
<p>In general, the idea is: a lot of methods have "options" as their last argument(s), and first argument(s) is the main "subject" of the method.<br>
So, when the method is converted to proc, you can "bind" those options with <code>rcurry</code>, and then pass it, like in my example above, as a 1-argument proc with some options set.</p>
<p>The alternative, BTW, would be not currying <em>last</em> arguments, but currying <em>any</em> keyword argument by name.</p> Ruby master - Feature #11161: Proc/Method#rcurry working like curry but in reverse orderhttps://bugs.ruby-lang.org/issues/11161?journal_id=721482018-05-18T03:27:56Zshyouhei (Shyouhei Urabe)shyouhei@ruby-lang.org
<ul></ul><p>zverok (Victor Shepelev) wrote:</p>
<blockquote>
<blockquote>
<p>It needs better (practical) usages to show usefulness of this proposal.</p>
</blockquote>
<p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/271">@akr (Akira Tanaka)</a> I believe the code in my comment provides the justification:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">URLS</span><span class="p">.</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">Faraday</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:get</span><span class="p">).</span><span class="nf">rcurry</span><span class="p">[</span><span class="ss">some_get_param: </span><span class="s1">'value'</span><span class="p">]).</span>
<span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="no">JSON</span><span class="p">.</span><span class="nf">method</span><span class="p">(</span><span class="ss">:parse</span><span class="p">).</span><span class="nf">rcurry</span><span class="p">[</span><span class="ss">symbolize_names: </span><span class="kp">true</span><span class="p">])</span>
</code></pre>
<p>In general, the idea is: a lot of methods have "options" as their last argument(s), and first argument(s) is the main "subject" of the method.<br>
So, when the method is converted to proc, you can "bind" those options with <code>rcurry</code>, and then pass it, like in my example above, as a 1-argument proc with some options set.</p>
<p>The alternative, BTW, would be not currying <em>last</em> arguments, but currying <em>any</em> keyword argument by name.</p>
</blockquote>
<p>I then think this might be called something other than currying-related name. Keyword arguments are not directly FP-oriented concepts. If you want to make keyword arguments better name it as such; if you want functional programming better we need another example that is more FP.</p>