【问题标题】:Getting Bad function Error in ElixirElixir 中出现错误的函数错误
【发布时间】:2018-03-13 22:34:54
【问题描述】:

只是弄乱了 elixir 结果得到了一个我无法弄清楚的错误。这是我的 sn-p,我为一些 api 调用实现了一个简单的 Parallel map 函数。 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 BEGUN"
    tasks = collection
        |> Enum.map(fn(x) -> Task.async(func.(x)) end)
    answer = Enum.map(tasks,fn(task) -> Task.await(task,limit) end)
    IO.puts "PMAP DONE"
    answer

IO.puts 用于调试。所以我猜错误发生在第二张地图上,因为 PMAP DONE 永远不会显示。我仍然有同样的错误。

这里到底出了什么问题?我之前几乎一字不差地写过同样的函数,它确实有效。

【问题讨论】:

    标签: functional-programming erlang elixir phoenix-framework


    【解决方案1】:

    您遇到的问题发生在网上:

      |> 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}
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-08-11
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多