如何在 elixir 中定义具有多个子句和可选参数的函数

How to define a function with multiple clauses and optional parameters in elixir

我正在尝试了解如何正确定义具有多个子句和可选参数的函数。当我写

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

(问题Elixir default parameters for named functions with multiple clauses

我收到警告:

warning: def sum/2 has multiple clauses and also declares default values. 
In such cases, the default values should be defined in a header. Instead of:

    def foo(:first_clause, b \ :default) do ... end
    def foo(:second_clause, b) do ... end

one should write:

    def foo(a, b \ :default)
    def foo(:first_clause, b) do ... end
    def foo(:second_clause, b) do ... end

我觉得 sum 的定义符合这个建议。

任何人都可以解释为什么会发生这种情况以及定义 sum 和消除警告的正确方法是什么。

我的 elixir 版本是 1.12.2.

提前致谢

声明一个没有 do 带有默认块的 head 子句

def sum(list, total \ 0) # ⇐ THIS

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