Erlang Elixir-递归列表值之和

Erlang Elixir-递归列表值之和,erlang,elixir,Erlang,Elixir,只是尝试对列表值进行简单求和 defmodule Mth do def sum_list([]) do 0 end def sum_list([H|T]) do H + sum_list(T) end end IO.puts Mth.sum_list([1, 2, 300]) 但我得到了这个错误: **(FunctionClauseError) no function clause matching in Mth.s

只是尝试对列表值进行简单求和

defmodule Mth do 

    def sum_list([]) do 
        0
    end

    def sum_list([H|T]) do
        H + sum_list(T)
    end

end

IO.puts Mth.sum_list([1, 2, 300]) 
但我得到了这个错误:

**(FunctionClauseError) no function clause matching in Mth.sum_list/1
    pokus.ex:3: Mth.sum_list([1, 2, 300])
    pokus.ex:14: (file)
    (elixir) src/elixir_lexical.erl:17: :elixir_lexical.run/2
    (elixir) lib/code.ex:316: Code.require_file/2**

变量和函数名需要使用小写字母。以大写字母开头的标识符保留给模块:

defmodule Mth do 

  def sum_list([]) do 
    0
  end

  def sum_list([h|t]) do
    h + sum_list(t)
  end

end

iex> IO.puts Mth.sum_list([1, 2, 300])
303
:ok

为了改进Chris的解决方案,如果希望求和函数是尾部递归函数,则需要将其修改为:

defmodule Mth do 
  def sum_list(list), do: do_sum_list(list, 0)

  defp do_sum_list([], acc),    do: acc
  defp do_sum_list([h|t], acc), do: do_sum_list(t, acc + h)
end

iex> Mth.sum_list([1, 2, 300])
303

为了完整起见,这也适用于:

defmodule Mth do

  def sum_list(list), do: do_sum_list(list,0)

  defp do_sum_list(l,i_acc), do: Enum.reduce(l, i_acc, fn(x, accum) -> x + accum end)

end

我发布这篇文章仅供其他人参考,他们可能会发现这个问题及其答案。

如果您打算使用
Enum.reduce
您可以更简单:

defmodule Mth do
  def sum_list(list), do: Enum.reduce(list, 0, &(&1 + &2))
end
试试这个:

sum_list=[1,2,300]     
Enum.sum sum_list     
303

def sum_list(list),do:Enum.reduce(list,0,&Kernel.+/2)
以这种方式实现sum_list函数是不明智的,因为您不会从Elixir的尾部调用优化中获益<代码>h+总和列表(t)将按如下1执行<代码>总和列表(t)2
h++
所以这里最后一个函数调用是
++
。这意味着,如果列表很长,可能会出现堆栈溢出错误。我知道有点讽刺。