【问题标题】:BadFunctionError expected a functionBadFunctionError 需要一个函数
【发布时间】:2020-12-25 00:14:11
【问题描述】:

我正在尝试实现一个函数,它接受一个列表和一个函数作为它的参数,然后将该函数应用于列表的每个元素,然后对结果求和,但是每次我在 iex 中运行程序时,我得到错误 - ** (BadFunctionError) 需要一个函数,得到: 1. 我似乎无法弄清楚问题是什么。我是 Elixir 和函数式编程的新手。

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

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

    我想通了,问题是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
    

    【讨论】:

      【解决方案2】:

      请注意,Mohamed 的回答虽然有些正确,但不是 Tail Call Optimized,因此它可能会炸毁堆栈。

      这是一个 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
      

      虽然原始版本可能在大量输入时崩溃,但由于堆栈耗尽,这个版本会很高兴地返回。

      幸运的是, 编译器足够聪明,可以将上面的调用优化为 TCO,因为它可以做到。但最好不要依赖编译器并牢记这一点。

      【讨论】:

        猜你喜欢
        • 2018-08-30
        • 2018-08-15
        • 1970-01-01
        • 2012-06-25
        • 2017-01-11
        • 2012-10-11
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多