Elixir BadFunctionError需要一个函数

Elixir BadFunctionError需要一个函数,elixir,erlang,Elixir,Erlang,我试图实现一个函数,该函数以列表和函数作为参数,然后将该函数应用于列表的每个元素,然后对结果求和,但每次我在iex中运行程序时,我都会得到错误-**(BadFunctionError)预期的函数,得到:1。我似乎不明白问题出在哪里。我不熟悉长生不老药和函数式编程 defmodule MyList do def mapsum([], _func) do 0 end def mapsum([head | tail], func) do func.(head) + map

我试图实现一个函数,该函数以列表和函数作为参数,然后将该函数应用于列表的每个元素,然后对结果求和,但每次我在iex中运行程序时,我都会得到错误-**(BadFunctionError)预期的函数,得到:1。我似乎不明白问题出在哪里。我不熟悉长生不老药和函数式编程

defmodule MyList do
  def mapsum([], _func) do
    0
  end

  def mapsum([head | tail], func) do
    func.(head) + mapsum(tail, func.(head))
  end
end

我发现问题出在mapsum函数体中的
func.(head)
参数

defmodule MyList do
  def mapsum([], _func) do
    0
  end

  def mapsum([head | tail], func) do
    func.(head) + mapsum(tail, func)
  end    
end

请注意,Mohamed的答案虽然有点正确,但并没有得到优化,因此可能会导致堆栈爆炸

这是一个TCO版本

defmodule MyListTCO do
  def mapsum(list, func, acc \\ 0)

  def mapsum([], _, acc), do: acc

  def mapsum([head | tail], func, acc),
    do: mapsum(tail, func, acc + func.(head))
end
虽然原始版本可能会因大量输入而崩溃,因为堆栈已耗尽,但此版本将很高兴返回

幸运的是,编译器足够聪明,可以优化上面的调用以实现总体拥有成本,因为它可以做到这一点。但最好还是不要依赖编译器,并记住这一点