<p>您可以在这里查看:<a href="https://stackoverflow.com/questions/31755499/what-is-the-symbols-purpose-in-elixir">What is the "|>" symbol's purpose in Elixir?</a>以获得<code>|></code>运算符的概述。但基本思想是<code>a |> f(b, c)</code>与{<cd3>}相同。当您执行类似<code>a |> f(b) |> g(c)</code>的操作时,这是非常有用的,根据上面的规则,它与<code>g(f(a, b), c)</code>相同,但是读起来更漂亮。在</p>
<p>也就是说,<code>|></code>运算符(称为管道)不是一元绑定(<code>>>=</code>),并且不允许像<code>>>=</code>那样“展平”深度嵌套的循环。对于在长生不老药中看起来更好的替代方法,您可以:</p>
<ol>
<li>使用实现monad语法的库(或添加您自己的),如<a href="https://github.com/rob-brown/MonadEx" rel="nofollow noreferrer">MonadEx</a></li>
<li><p>停止使用这种循环方法,例如,使用递归函数预先为字母生成数字赋值,如下所示:</p>
<pre><code>defmodule Smm do
# some more things
def assignments(0, _), do: [[]]
def assignments(n, digits \\ Enum.into(0..9, HashSet.new)) do
digits
|> Stream.flat_map(fn (d) ->
for rest <- assignments(n - 1, Set.delete(digits, d)) do
[d | rest]
end
end)
end
end
for [s, e, n, d, m, o, r, y] <- Smm.assignments(8) do
w_send = Smm.to_number([s, e, n, d])
w_more = Smm.to_number([m, o, r, e])
w_money = Smm.to_number([m, o, n, e, y])
if s > 0 && m > 0 && (w_send + w_more == w_money) do
IO.inspect([w_send, w_more, w_money])
end
end
</code></pre></li>
</ol>