2016-01-20 87 views
0

失敗代碼實現:協議可枚舉不適合3

Enum.map(1..30, &(&1 * 2)) |> Enum.map &(&1 + 1) |> Enum.sum 
** (Protocol.UndefinedError) protocol Enumerable not implemented for 3 
    (elixir) lib/enum.ex:1: Enumerable.impl_for!/1 
    (elixir) lib/enum.ex:112: Enumerable.reduce/3 
    (elixir) lib/enum.ex:1400: Enum.reduce/3 
    (elixir) lib/enum.ex:1043: anonymous fn/3 in Enum.map/2 
    (elixir) lib/enum.ex:1387: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (elixir) lib/enum.ex:1043: Enum.map/2 

但這個工作完全正常:

iex(18)> arr = Enum.map(1..30, &(&1 * 2)) |> Enum.map &(&1 + 1) 
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 
45, 47, 49, 51, 53, 55, 57, 59, 61] 
iex(19)> arr |> Enum.sum 
960 

這有什麼錯我的第一實施?

回答

5

如果您運行的藥劑1.2,那麼你應該看到一個警告:

警告:你是管道成一個函數調用沒有括號,這可能是模糊的。請用圓括號將你要輸入的功能封裝起來。例如:

foo 1 |> bar 2 |> baz 3 

應該寫成:

foo(1) |> bar(2) |> baz(3) 

你的第一個例子改爲:

Enum.map(1..30, &(&1 * 2)) |> Enum.map(&(&1 + 1)) |> Enum.sum 

進行了詳細的說明,請參見Why Can't I Chain String.replace?