这个表达链可以在没有括号的情况下重写吗?

时间:2014-03-13 21:44:14

标签: elixir

所以我在Elixir中玩流,我正在玩|>操作员;我有很多使用F#的经验,所以感觉非常自然。所以我尝试了这个:

1..10 |> Stream.map &(&1 * &1) |> Enum.to_list

只是吐出前十个方格的列表。但它没有用。没问题;似乎是运算符优先级的问题,因为这很好用:

(1..10 |> Stream.map &(&1 * &1)) |> Enum.to_list

但是我想知道这是否可以重写而不必将表达式的前半部分括起来。

2 个答案:

答案 0 :(得分:6)

我认为你的问题在于你在没有括号的情况下调用Stream.map,然后尝试管道。我必须承认,我不确定机制,但你的原始呼吁似乎被解释为:

1..10 |> Stream.map(&(&1 * &1) |> Enum.to_list)

我会重写这个以在函数调用中使用parens:

1..10 |> Stream.map(&(&1 * &1)) |> Enum.to_list

就个人而言,我主要在函数调用中使用parens。例外情况是零arg函数调用,宏调用和偶尔的IO.puts / inspect调用(我通常只是为了调试目的)。

我发现这种方法非常有用,特别是在管道时,因为它消除了可能的歧义。

答案 1 :(得分:0)

我也是初学者,如果我错了,请好好指出,但你可以这样做吗?

iex(11)> 1..10 |> Enum.map(&(&1 * &1))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]