Elixir高阶函数

时间:2016-05-29 15:52:15

标签: elixir

我写了以下简单的模型:

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'函数?

1 个答案:

答案 0 :(得分: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函数在模块内被声明为匿名函数,因此它不是公开可用的函数,因此不能在定义它的上下文之外使用。
  4. 这应该有效:

    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. 该功能应包括arity。
    3. 应在函数名称之前添加&运算符,以将其计算为函数。 (我认为)
    4. 这应该有效:

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