Erlang List Comprehension Gotcha

Aqui está uma pequena pergunta para você: Qual é o resultado dessa compreensão de lista em Erlang?

[ {A,B} || {A,B} <- [1,2,{3,4},[5,6]] ]

UMA.) [{1,2}, {3,4}, {5,6}]

B.) badmatch error

C.) [{3,4}]

Quem disse A? Tá brincando né? Vá reler “Aprenda um pouco de Erlang”.

Mas e as escolhas entre B e C. Devo admitir, sempre presumi que B seria correto, mas na verdade, é realmente C. Hein?

Observação: uma compreensão de lista Erlang filtrará silenciosamente quaisquer valores que não possam ser comparados com a expressão à esquerda da seta.

Isso é especialmente notável se você (ab) estiver usando compreensões de lista para efeitos colaterais, faça este teste de unidade, por exemplo:

[ ?assertEqual(A, B+1) || {A, B} <- fetch_some_list_of_results() ]

Agora vamos supor que fetch_some_list_of_results()realmente retorne [error, error, error]. O teste ainda passaria, já que nenhuma asserção é executada. Cuidado!

Melhor ainda: escreva o teste acima assim para obter um badmatcherro, caso sua suposição sobre os resultados esteja errada:

lists:foreach(fun ({A, B}) ->
?assertEqual(A, B+1)
end, fetch_some_list_of_results())

Respostas relacionadas:

Achatar uma lista de listas em uma linha em Python