Functional programming 获取Elixir中的坏函数错误

Functional programming 获取Elixir中的坏函数错误,functional-programming,erlang,elixir,phoenix-framework,Functional Programming,Erlang,Elixir,Phoenix Framework,在处理elixir结果时遇到了一个我无法理解的错误。这是我的代码片段,我为一些api调用实现了一个简单的并行映射函数。func是进行实际调用的函数,它返回{:ok,result}或{:error,reason},我在另一个函数中的映射之后处理这些函数 本来 def pmap(collection,func,limit \\ 5000) do collection |> Enum.map(&Task.async(func.(&1))) |> En

在处理elixir结果时遇到了一个我无法理解的错误。这是我的代码片段,我为一些api调用实现了一个简单的并行映射函数。func是进行实际调用的函数,它返回{:ok,result}或{:error,reason},我在另一个函数中的映射之后处理这些函数

本来

def pmap(collection,func,limit \\ 5000) do
    collection
    |> Enum.map(&Task.async(func.(&1)))
    |> Enum.map(&Task.await(&1,limit))
获取错误,因此为了可读性将其更改为此

def pmap(collection,func,limit) do
  collection
  |>Enum.map(fn(x) -> Task.async(func.(x)) end)
  |>Enum.map(fn(task) -> Task.await(task,limit) end)
我得到的错误状态

[error] Task #PID<0.197.0> started from #PID<0.187.0> terminating
** (BadFunctionError) expected a function, got: {:ok,result}
erlang.apply/2
(elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2
(elixir) lib/task/supervised.ex:36: Task.Supervised.reply/5
(stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Function: &:erlang.apply/2
IO.puts用于调试。因此我猜错误发生在第二个映射上,因为PMAP DONE从未显示。我仍然有同样的错误


这里到底出了什么问题?我以前几乎是一字不差地编写过相同的函数,但它成功了。

您遇到的问题发生在联机:

  |> Enum.map(fn(x) -> Task.async(func.(x)) end)
要使其正常工作,您需要使用匿名函数包装函数执行,如:

  |> Enum.map(fn(x) -> Task.async(fn -> func.(x) end) end)
这是因为如果您运行
func.(x)
这将进行计算,计算结果将传递给
Task.async/1
,而当您使用函数包装它时,将由
Task
执行它

提示在错误消息中指示:

** (BadFunctionError) expected a function, got: {:ok,result}
希望这有帮助

** (BadFunctionError) expected a function, got: {:ok,result}