As compreensões oferecem um recurso para transformar Enumerables de forma fácil e declarativa.
Para declarar uma compreensão bem simples, podemos usar a palavra-chave for seguida de um gerador e de um bloco do, que cria os novos valores a partir dos valores enumerados.
for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]
As compreensões também podem ter filtros. Os valores que não passam pelo filtro são removidos da lista final:
for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]
Podemos declarar compreensões mais complicadas ao longo de várias linhas:
for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
rem(number, 2) == 0 do
atom
end
# => [:b, :d]
Um produto cartesiano pode ser criado usando vários geradores. Isso significa que cada valor gerado pelo primeiro gerador será pareado uma vez com cada valor gerado pelo segundo gerador:
for x <- [0, 1],
y <- [0, 1] do
{x, y}
end
# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]
Seu trabalho na loja de moda online continua. Você tem a ideia de um recurso do site em que uma combinação de roupas é sugerida ao usuário. Você quer dar muitas sugestões, mas não quer dar sugestões ruins, então decide usar uma compreensão de lista, já que assim consegue gerar combinações de roupas com facilidade e depois filtrá-las por algum critério.
As peças de roupa são armazenadas em um mapa:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
Implemente get_combinations/3 para receber uma lista de peças de cima, uma lista de peças de baixo e uma lista de palavras-chave de opções. Por enquanto, defina o padrão das opções como uma lista de palavras-chave vazia. A função deve retornar o produto cartesiano das listas.
tops = [
%{item_name: "Dress shirt"},
%{item_name: "Casual shirt"}
]
bottoms = [
%{item_name: "Jeans"},
%{item_name: "Dress trousers"}
]
BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
# {%{item_name: "Dress shirt"}, %{item_name: "Jeans"}},
# {%{item_name: "Dress shirt"}, %{item_name: "Dress trousers"}},
# {%{item_name: "Casual shirt"}, %{item_name: "Jeans"}},
# {%{item_name: "Casual shirt"}, %{item_name: "Dress trousers"}}
# ]
Cada peça de roupa tem um campo :base_color; use esse campo para filtrar todas as combinações em que a peça de cima e a peça de baixo têm a mesma cor base.
tops = [
%{item_name: "Dress shirt", base_color: "blue"},
%{item_name: "Casual shirt", base_color: "black"}
]
bottoms = [
%{item_name: "Jeans", base_color: "blue"},
%{item_name: "Dress trousers", base_color: "black"}
]
BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
# {%{item_name: "Dress shirt", base_color: "blue"},
# %{item_name: "Dress trousers", base_color: "black"}},
# {%{item_name: "Casual shirt", base_color: "black"},
# %{item_name: "Jeans", base_color: "blue"}}
# ]
Cada peça de roupa tem um campo :price associado a ela. Você quer dar muitas sugestões, mas também quer oferecer aos usuários a oportunidade de escolher um preço dentro do orçamento. Na lista de palavras-chave de opções, use :maximum_price para filtrar as combinações em que o preço da peça de cima somado ao da peça de baixo ultrapassa o preço máximo.
Se nenhum maximum_price for especificado, o padrão deve ser 100.00
tops = [
%{item_name: "Dress shirt", base_color: "blue", price: 35},
%{item_name: "Casual shirt", base_color: "black", price: 20}
]
bottoms = [
%{item_name: "Jeans", base_color: "blue", price: 30},
%{item_name: "Dress trousers", base_color: "black", price: 75}
]
BoutiqueSuggestions.get_combinations(tops, bottoms, maximum_price: 50)
# => [
# {%{item_name: "Casual shirt", base_color: "black", price: 20},
# %{item_name: "Jeans", base_color: "blue", price: 30}}
# ]
Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.