3

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

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

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

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

但我想知道这是否可以重写而不必为表达式的前半部分加上括号。

4

2 回答 2

6

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

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

我会重写它以在函数调用中使用括号:

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

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

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

于 2014-03-13T22:26:03.770 回答
0

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

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

于 2014-03-16T11:46:14.297 回答