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条)。很好,我不知道匹配。