<p>Haskell通过两个因素消除了这种语法干扰:操作符的关联性和lambdas的一个很好的语言规则。在</p>
<p>使用<a href="http://elixir-lang.org/getting-started/basic-operators.html#operator-table" rel="nofollow">associativity rules</a>可以消除语法中不必要的括号。例如,在Elixir中,加法与左边相关联,所以当你写<code>a + 2 + x</code>时,它被解释为<code>(a + 2) + x</code>。关联性规则允许您去掉括号。如果您的意思是<code>a + (2 + x)</code>,那么您必须显式地编写它。在</p>
<p>你可以使用操作符的关联性来帮助解决长生不老的问题,有些人已经有了。<a href="https://github.com/rob-brown/MonadEx" rel="nofollow">MonadEx</a>库定义了一个绑定运算符<code>~>></code>,它可以让您将程序的内容编写为</p>
<pre><code> Smm.remove(digits, [0])
~>> fn s -> Smm.remove(digits, [s])
~>> fn e -> Smm.remove(digits, [s,e])
~>> fn n -> Smm.remove(digits, [s,e,n])
~>> fn d -> return(Smm.to_number([s,e,n,d]))
~>> fn w_send -> Smm.remove(digits, [0,s,e,n,d])
~>> fn m -> Smm.remove(digits, [s,e,n,d,m])
~>> fn o -> Smm.remove(digits, [s,e,n,d,m,o])
~>> fn r -> return(Smm.to_number([m,o,r,e]))
~>> fn w_more -> Smm.remove(digits, [s,e,n,d,m,o,r])
~>> fn y -> return(Smm.to_number([m,o,n,e,y]))
~>> fn w_money -> Smm.guard(w_send + w_more == w_money)
~>> fn -> return([w_send, w_more, w_money])
end end end end end end end end end end end end
</code></pre>
<p>运算符关联性并不能消除lambda表达式都以同一个位置结束。后面的表达式需要在前面的lambdas中,这样它们才能看到前面引入的变量。Haskell通过一个简单的语法规则<a href="https://www.haskell.org/onlinereport/haskell2010/haskellch3.html" rel="nofollow">"lambda abstractions ... extend as far to the right as possible"</a>来消除这种干扰。因为lambdas一直向右扩展,所以用相同样式编写的Haskell代码没有一大堆结束括号。在</p>
^{pr2}$
<p>我无法想象长生不老药有什么相应的诀窍。每一个<code>fn</code>都必须在末尾<code>end</code>,因此{<cd6>}的数量将与绑定的数量相同。我想你只需要不断地翻表<code>(╯°□°)╯︵ ┻━┻</code>。在</p>