检查列表中的所有元素是否都具有:ok元素

Fla*_*lan 3 functional-programming list-comprehension elixir

我有一个这样的元组列表

[
    {:ok, {"0000 0000 "}},
    {:ok, %{AM01: %{"C4" => "1111", "C5" => "1"}}},
    {:ok, %{AM04: %{"C2" => "2222", "C6" => "2"}}}
]
Run Code Online (Sandbox Code Playgroud)

元组:ok的第一个元素表示映射确定。

如何将这个清单缩小为一个这样的清单

[:ok, :ok, :ok]
Run Code Online (Sandbox Code Playgroud)

因为在此转换之后,我将检查Enum.all是否一切正常?

Ale*_*kin 6

@JustinWood展示了最惯用的方法。

最惯用的方法可能是使用Kernel.match?/2,这基本上是两个/ 子句的语法糖truefalse

Enum.all?(input, &match?({:ok, _}, &1))
#? true
Run Code Online (Sandbox Code Playgroud)

:ok通常,所有操作都是通过Kernel.SpecialForms.for/1列表理解来完成的,列表理解可以在一个循环中进行过滤和映射:

for {:ok, _} <- input, do: :ok 
#? [:ok, :ok, :ok]
Run Code Online (Sandbox Code Playgroud)


Jus*_*ood 5

无需遍历列表以转换为原子列表,您可以Enum.all?/2立即使用。

result = [
  {:ok, {"0000 0000 "}},
  {:ok, %{AM01: %{"C4" => "1111", "C5" => "1"}}},
  {:ok, %{AM04: %{"C2" => "2222", "C6" => "2"}}}
]

Enum.all?(result, fn
  {:ok, _} -> true
  _ -> false
end)
Run Code Online (Sandbox Code Playgroud)