为什么我不能在这个 Elixir 列表求和中使用默认参数?
Why can't I use default params in this Elixir list summation?
对列表中的值进行简单求和:
defmodule ListMath do
def sum_list([head | tail], accumulator) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
但是调用它需要为累加器传递一个值,例如:
IO.puts ListMath.sum_list([4,5,6],0)
15
我想这样称呼它:
IO.puts ListMath.sum_list([4,5,6])
** (UndefinedFunctionError) function ListMath.sum_list/1 is undefined...
如果我将其更改为采用 accumulator 参数的默认值,它将不再编译:
defmodule ListMath do
def sum_list([head | tail], accumulator // 0) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
- 我正在使用 Elixir 1.3.4。
- 我在 Elixir 0.12 中看过 this question,这似乎很相关,但仍然不明白。
你在最后一个例子中走在了正确的道路上。
elixir 中的默认值由 \
而不是 //
决定。所以你的情况是:
defmodule ListMath do
def sum_list([head | tail], accumulator \ 0) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
您甚至可以拥有所谓的函数头定义,它规定了方法的预期变量,例如
defmodule ListMath do
def sum_list(list, acc \ 0)
def sum_list([head | tail], accumulator) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
这样一目了然就可以知道方法函数头是什么样子,而不必查找默认值的创建位置。
对列表中的值进行简单求和:
defmodule ListMath do
def sum_list([head | tail], accumulator) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
但是调用它需要为累加器传递一个值,例如:
IO.puts ListMath.sum_list([4,5,6],0)
15
我想这样称呼它:
IO.puts ListMath.sum_list([4,5,6])
** (UndefinedFunctionError) function ListMath.sum_list/1 is undefined...
如果我将其更改为采用 accumulator 参数的默认值,它将不再编译:
defmodule ListMath do
def sum_list([head | tail], accumulator // 0) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
- 我正在使用 Elixir 1.3.4。
- 我在 Elixir 0.12 中看过 this question,这似乎很相关,但仍然不明白。
你在最后一个例子中走在了正确的道路上。
elixir 中的默认值由 \
而不是 //
决定。所以你的情况是:
defmodule ListMath do
def sum_list([head | tail], accumulator \ 0) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
您甚至可以拥有所谓的函数头定义,它规定了方法的预期变量,例如
defmodule ListMath do
def sum_list(list, acc \ 0)
def sum_list([head | tail], accumulator) do
sum_list(tail, head + accumulator)
end
def sum_list([], accumulator) do
accumulator
end
end
这样一目了然就可以知道方法函数头是什么样子,而不必查找默认值的创建位置。