gpt4 book ai didi

functional-programming - 在 Elixir 中获取 Bad function 错误

转载 作者:行者123 更新时间:2023-12-01 04:38:54 25 4
gpt4 key购买 nike

只是弄乱了 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 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 用于调试。所以我猜错误发生在第二张 map 上,因为从不显示 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}

希望这对您有所帮助!

关于functional-programming - 在 Elixir 中获取 Bad function 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46532566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com