<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Currently Swift provides a static curried function for every instance&nbsp;function&nbsp;defined. It pretty often allows to avoid closures and be explicit about functions used. For example:<div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class=""><span style="color: rgb(84, 99, 72);" class="">//flip — flipping an order of arguments for curried functions.</span></span></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">var</span><span style="font-variant-ligatures: no-common-ligatures;" class=""> foo = [[</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">0</span><span style="font-variant-ligatures: no-common-ligatures;" class="">, </span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">1</span><span style="font-variant-ligatures: no-common-ligatures;" class="">], [</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">1</span><span style="font-variant-ligatures: no-common-ligatures;" class="">, </span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">2</span><span style="font-variant-ligatures: no-common-ligatures;" class="">], [</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">2</span><span style="font-variant-ligatures: no-common-ligatures;" class="">, </span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">3</span><span style="font-variant-ligatures: no-common-ligatures;" class="">], [</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">3</span><span style="font-variant-ligatures: no-common-ligatures;" class="">, </span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">4</span><span style="font-variant-ligatures: no-common-ligatures;" class="">]].</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">map</span><span style="font-variant-ligatures: no-common-ligatures;" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">flip</span><span style="font-variant-ligatures: no-common-ligatures;" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">Array</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&lt;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">Int</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&gt;.</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">prefix</span><span style="font-variant-ligatures: no-common-ligatures;" class="">)(</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">1</span><span style="font-variant-ligatures: no-common-ligatures;" class="">))</span>&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: #546348" class="">//[[0], [1], [2], [3]]</span></div><div class=""><br class=""></div><div class="">However this behavior is not unified, there is no such behavior available for variables or constants. For example code like following is impossible as Array.first is a variable but not a&nbsp;function:</div><div class=""><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">var</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">&nbsp;foo&nbsp;= [[</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">0, 1]</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">,&nbsp;[</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">1, 2]</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">,&nbsp;[</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">2, 3]</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">,&nbsp;[</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">3, 4]</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">].</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">map</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">(<font color="#587ea8" class="">Array&lt;Int&gt;.first</font></span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures;" class="">)&nbsp;</span><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(84, 99, 72);" class="">//Does not compile, but should be [0, 1, 2, 3]</span></div><div class=""><span style="font-family: Menlo; font-size: 11px; font-variant-ligatures: no-common-ligatures; color: rgb(84, 99, 72);" class=""><br class=""></span></div><div class="">I was trying to find what cause to not define static curried functions for variables and constants and was not able to find a good reason. It is especially interesting as currently if you define both variable and instance function with the same name, Swift complains about redeclaration of function, so it it treat variable already as a function, but does not provide an alternative way to call it. Moreover following definitions of variable and static functions a conflicting, as variable definitely has its hidden curried implementation somewhere but invisible for others:</div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">class</span><span style="font-variant-ligatures: no-common-ligatures" class=""> Foo {</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">var</span><span style="font-variant-ligatures: no-common-ligatures" class=""> bar: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Int</span><span style="font-variant-ligatures: no-common-ligatures" class=""> = </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">0</span></div><div style="margin: 0px; line-height: normal; color: rgb(84, 99, 72);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">&nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">static</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">func</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> bar(</span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">self</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Foo</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">) -&gt; </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Int</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> {} </span><span style="font-variant-ligatures: no-common-ligatures" class="">//Definition conflicts with previous value</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div></div></div><div class="">One of assumptions why curried functions for variables are hidden — it will cause ambiguity in code, but I was not able to find examples of ambiguity.&nbsp;</div><div class="">Could someone explain why this behavior is not consistent across&nbsp;functions, variables and constants? Should we change it to be consistent and make visible curried static functions for variables and functions? Especially since it is in a nature of current implementation.</div><div class=""><br class=""></div><div class="">Best,</div><div class="">Nikita Leonov</div></body></html>