在 Elixir 世界中循环中间返回的替代方法是什么

Dan*_*Dan 1 elixir

我还是 Elixir 的新手。我正在尝试创建一个接受请求列表并处理每个请求的方法。如果全部通过则返回 {:ok, "success"} 或 {:error, error_reason} 如果失败则返回。

在其他语言中,我可以做这样的事情。假设流程函数返回 {:ok, "success"} 或 {:error, error_reason}。

def func(requests):
   for request in requests:
       if {:error, error_reason} <- process(request):
           return {:error, error_reason}

   return {:ok, "success"}
end
Run Code Online (Sandbox Code Playgroud)

在 Elixir 世界中这样做的正确方法是什么?

gle*_*nsl 5

我会使用递归:

def func([head | tail]) do
  case process(head) do
    {:error, reason} -> {:error, reason}
    {:ok, _} -> func(tail)
  end
end

def func([]), do: {:ok, "success"}
Run Code Online (Sandbox Code Playgroud)

循环本质上是命令式的,而 Elixir 本质上是一种函数式语言,因此我认为递归和高阶函数是使用循环的更自然的替代方案。