为什么我不能在这个 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 中的默认值由 \ 而不是 // 决定。所以你的情况是:

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

这样一目了然就可以知道方法函数头是什么样子,而不必查找默认值的创建位置。