传递并使用Elixir中的命名函数?

传递并使用Elixir中的命名函数?,elixir,Elixir,以下Elixir代码不正确,但传达了(我认为)期望的结果: defmodule Question do def dbl(n), do: n * 2 def trp(n), do: n * 3 def consumer(xs, f) do Enum.filter(xs, f.(x) > 5) end end Question.consumer([1, 2, 3], dbl) # [3] Question.consumer([1, 2, 3], trp) # [2,

以下Elixir代码不正确,但传达了(我认为)期望的结果:

defmodule Question do
  def dbl(n), do: n * 2
  def trp(n), do: n * 3

  def consumer(xs, f) do
    Enum.filter(xs, f.(x) > 5)
  end
end

Question.consumer([1, 2, 3], dbl) # [3]
Question.consumer([1, 2, 3], trp) # [2, 3]
如何编写
consumer
方法来正确使用
dbl
trp
?那你怎么称呼它呢

谢谢大家!

编辑:

请回答一个相关的问题。您将如何使用Elixir编写和调用下面的Scala代码:

def dbl(n: Int): Int = n * 2
def trp(n: Int): Int = n * 3

def consume(xs: List[Int], f: (Int) => Int): List[Int] =
  xs.filter(x => f(x) > 5)

consume(List(1, 2, 3), dbl) # List(3)
consume(List(1, 2, 3), trp) # List(2, 3)

(谢谢)*2

与Scala的
x=>f(x)>5
相当的长生不老药是
fnx->f(x)>5end
。这是您使用它的方式:

defmodule Question do
  def dbl(n), do: n * 2
  def trp(n), do: n * 3

  def consumer(list, f) do
    Enum.filter(list, fn x -> f.(x) > 5 end)
  end
end
然后,您可以使用以下方法调用它:

Question.consumer([1, 2, 3], &Question.dbl/1)   # => [3]
Question.consumer([1, 2, 3], &Question.trp/1)   # => [2, 3]

附加说明:

  • 您也可以使用速记
    和(f.(&1)>5)
    代替完整功能
  • 请注意
    &
    /1
    -您需要传递对命名模块方法的完整引用
  • 另一方面,如果将
    dbl
    trp
    函数设为匿名函数,则可以直接将它们作为参数传递:

    dbl = fn n -> n * 2 end
    trp = fn n -> n * 3 end
    
    Question.consumer([1, 2, 3], dbl)   # => [3]
    Question.consumer([1, 2, 3], trp)   # => [2, 3]
    
  • 请参阅:


谢谢您的回答。请你看一下编辑稿好吗。我不知道如何使用带有传入函数的
Enum.filter
Enum.filter(xs,f>5)
似乎不起作用?我只想使用提供的函数过滤集合-没有映射-所以[2]和[2,3]的scala输出就是我想要的。太棒了。谢谢你的快速帮助,这正是我想要的!