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 badmatch
erro, 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