所以我在Elixir中玩流,我也在玩|>运算符; 我有很多使用F#的经验,所以感觉非常自然.所以我尝试了这个:
1..10 |> Stream.map &(&1 * &1) |> Enum.to_list
Run Code Online (Sandbox Code Playgroud)
只是吐出前十个方格的列表.但它没有用.没问题; 似乎是运算符优先级的问题,因为这很好:
(1..10 |> Stream.map &(&1 * &1)) |> Enum.to_list
Run Code Online (Sandbox Code Playgroud)
但我想知道这是否可以重写,而不必将表达式的前半部分括起来.
我认为你的问题在于你在Stream.map没有括号的情况下打电话,然后尝试管道.我必须承认,我不确定机制,但你的原始呼叫似乎被解释为:
1..10 |> Stream.map(&(&1 * &1) |> Enum.to_list)
Run Code Online (Sandbox Code Playgroud)
我会重写这个以在函数调用中使用parens:
1..10 |> Stream.map(&(&1 * &1)) |> Enum.to_list
Run Code Online (Sandbox Code Playgroud)
就个人而言,我主要在函数调用中使用parens.这种情况的例外是零arg函数调用,宏调用和偶尔的IO.puts/inspect调用(我通常只是出于调试目的).
我发现这种方法非常有用,特别是在管道时,因为它消除了可能的含糊之处.