As compreensões oferecem uma forma simples e declarativa de transformar Enumerables.
Para declarar uma compreensão muito 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]
É possível criar um produto cartesiano com vários geradores. Isto significa que cada valor gerado pelo primeiro gerador será emparelhado 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}]
O teu trabalho na loja de moda online continua. Tens a ideia de criar uma funcionalidade no site que sugere uma combinação de peças ao utilizador. Embora queiras dar muitas sugestões, não queres dar sugestões más, por isso decides usar uma compreensão de listas, pois podes facilmente gerar combinações de peças e depois filtrá-las segundo alguns critérios.
As peças de roupa são armazenadas como um mapa:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
Implementa 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 agora, define as opções como tendo por predefinição uma lista de palavras-chave vazia. A função deve devolver 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; usa este 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. Embora queiras dar muitas sugestões, queres dar aos utilizadores a oportunidade de escolher um preço dentro do seu orçamento. A partir da lista de palavras-chave de opções, usa :maximum_price para filtrar as combinações em que o preço da peça de cima e da peça de baixo ultrapassa o preço máximo.
Se maximum_price não for especificado, o valor predefinido 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}}
# ]
Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.