Elixir具有多个子句的命名函数的默认参数

时间:2014-02-27 21:22:39

标签: default-parameters elixir

我无法理解默认参数如何与命名函数中的多个子句交互。归结起来,为什么以下代码片段有效?

defmodule Lists do

  def sum([], total \\ 0), do: total
  def sum([h|t], total), do: h + sum(t, total)

end

根据我的理解,编译器将其扩展为:

defmodule Lists do

  def sum([]), do: sum([], 0)
  def sum([], total), do: total
  def sum([h|t], total), do: h + sum(t, total)

end

所以我希望发生以下情况:

iex(1)> Lists.sum [1,2,3,4]
** (FunctionClauseError) no function clause matching in Lists.sum/1

取而代之的是:

iex(1)> Lists.sum [1,2,3,4]
10

使用 Elixir 0.12.4

1 个答案:

答案 0 :(得分:11)

实际上,def sum([], total \\ 0), do: total将定义一个看起来像def sum(list), do: sum(list, 0)的函数子句。所以我绝对可以看到你的困惑。我保证在将来的版本中会针对此类情况发出警告。谢谢!