Elixir BadFunctionError需要一个函数
我试图实现一个函数,该函数以列表和函数作为参数,然后将该函数应用于列表的每个元素,然后对结果求和,但每次我在iex中运行程序时,我都会得到错误-**(BadFunctionError)预期的函数,得到:1。我似乎不明白问题出在哪里。我不熟悉长生不老药和函数式编程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
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
虽然原始版本可能会因大量输入而崩溃,因为堆栈已耗尽,但此版本将很高兴返回
幸运的是,编译器足够聪明,可以优化上面的调用以实现总体拥有成本,因为它可以做到这一点。但最好还是不要依赖编译器,并记住这一点