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

Functional programming 检查列表中的所有元素是否都有:ok元素,functional-programming,elixir,list-comprehension,erlang,Functional Programming,Elixir,List Comprehension,Erlang,我有一个这样的元组列表 [ {:ok, {"0000 0000 "}}, {:ok, %{AM01: %{"C4" => "1111", "C5" => "1"}}}, {:ok, %{AM04: %{"C2" => "2222", "C6" => "2"}}} ] [:ok, :ok, :ok] tuple:ok的第一个元素表示映射ok 我怎样才能把这个列表简化成这样一个列表 [ {:ok, {"0000 0000 "}},

我有一个这样的元组列表

[
    {:ok, {"0000 0000 "}},
    {:ok, %{AM01: %{"C4" => "1111", "C5" => "1"}}},
    {:ok, %{AM04: %{"C2" => "2222", "C6" => "2"}}}
]
[:ok, :ok, :ok]
tuple:ok的第一个元素表示映射ok

我怎样才能把这个列表简化成这样一个列表

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

因为在这个转换之后,我将用Enum.all检查all是否ok?

而不是遍历列表转换为原子列表,您可以立即使用
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)
使用,可以按如下方式缩小贴图:

Enum.map(foo和elem(&1,0))
>[:好的,:好的,:好的]
或者直接使用
all?

Enum.all?(foo,&elem(&1,0)==:确定)
>真的

@JustinWood展示了最惯用的方法

最惯用的方法可能是使用,这基本上是两个
true
/
false
子句的一种用法:

Enum.all?(input, &match?({:ok, _}, &1))
#⇒ true

获取所有
:ok
通常通过列表理解完成,列表理解在一个循环中过滤和映射:

for {:ok, _} <- input, do: :ok 
#⇒ [:ok, :ok, :ok]
对于{:ok,}另一个选项:

  def check_ok([]), do: true
  def check_ok([{:ok, _} | tail]), do: check_ok(tail)
  def check_ok(_), do: false

只要在列表的每个元素中找到
:ok
,空列表最终将匹配(子句#1)并返回true。否则,当发现
:ok
以外的内容时,递归将立即结束,函数将返回false(第3条)。

很好,我不知道
匹配。