传递并使用Elixir中的命名函数?
以下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,
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输出就是我想要的。太棒了。谢谢你的快速帮助,这正是我想要的!