【问题标题】:Elixir high order functionElixir 高阶函数
【发布时间】:2016-05-29 15:52:15
【问题描述】:

我写了以下简单的模型:

defmodule Simple do
  def add(a, b) do a + b end
  som = fn(x, y) -> x + y end
  def oper_array(fct, arr, init) do
    Enum.scan(arr, init, fct.())
  end
end

但是

Simple.oper_array(a, 0, Simple.som) or 
Simple.oper_array(a, 0, Simple.add)

永远给予

(UndefinedFunctionError) undefined function Simple.som/0 or
(UndefinedFunctionError) undefined function Simple.add/0

如果我这样写函数 'oper_array' 会得到同样的结果:

Enum.scan(arr, init, fct)

我应该如何编写函数'oper_array'?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    我将从定义没有匿名函数的模块开始。

    defmodule Simple do
      def add(a, b), do: a + b
      def oper_array(fct, arr, init) do
        Enum.scan(arr, init, fct)
      end
    end
    

    1。 Simple.oper_array(a, 0, Simple.som)

    问题:

    1. 函数中元素的顺序不正确。
    2. & 运算符不是必需的,因为它已经是上下文中可用的匿名函数表达式,如下所示。 (我认为)
    3. som/2 函数在模块内被声明为匿名函数,因此它不是公开可用的函数,因此不能在定义它的上下文之外使用。

    这应该可行:

    a = [1,2,3]
    Simple.oper_array(fn(x, y) -> x + y end, a, 0)
    

    a = [1,2,3]
    som = fn(x, y) -> x + y end
    Simple.oper_array(som, a, 0)
    

    2。 Simple.oper_array(a, 0, Simple.add)

    问题:

    1. 函数中元素的顺序不正确。
    2. 函数应包含元数。
    3. & 运算符应添加到函数名称之前,以将其计算为函数。 (我认为)

    这应该可行:

    a = [1,2,3]
    Simple.oper_array(&Simple.add/2, a, 0)
    

    【讨论】:

    • a = [1,2,3] Simple.oper_array(&Simple.add/2, a, 0) 有效,但不适用于匿名函数 som = fn(x, y) -> x + y end。元素的顺序不正确......是的,抱歉。非常感谢。
    猜你喜欢
    • 2016-05-07
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多