Las comprensiones ofrecen un mecanismo para transformar Enumerables de forma sencilla y declarativa.
Para declarar una comprensión muy sencilla, podemos usar la palabra clave for seguida de un generador y un bloque do que crea los nuevos valores a partir de los valores enumerados.
for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]
Las comprensiones también pueden tener filtros. Los valores que no pasan el filtro se eliminan de la lista final:
for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]
Podemos declarar comprensiones más complicadas en varias líneas:
for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
rem(number, 2) == 0 do
atom
end
# => [:b, :d]
Se puede crear un producto cartesiano usando varios generadores. Esto significa que cada valor generado por el primer generador se emparejará una vez con cada valor generado por el segundo generador:
for x <- [0, 1],
y <- [0, 1] do
{x, y}
end
# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]
Tu trabajo en la tienda de moda online continúa. Se te ocurre la idea de una funcionalidad del sitio web en la que se sugiere un conjunto al usuario. Aunque quieres dar muchas sugerencias, no quieres dar sugerencias malas, así que decides usar una comprensión de listas, ya que puedes generar fácilmente combinaciones de conjuntos y luego filtrarlas según algunos criterios.
Las prendas de ropa se almacenan como un mapa:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
Implementa get_combinations/3 para que reciba un array de prendas superiores, un array de prendas inferiores y una lista de palabras clave de opciones. Por ahora, haz que las opciones tengan como valor predeterminado una lista de palabras clave vacía. La función debe devolver el producto cartesiano de los arrays.
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 prenda de ropa tiene un campo :base_color; usa este campo para filtrar todas las combinaciones en las que la prenda superior y la inferior tengan el mismo color 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 prenda de ropa tiene asociado un campo :price. Aunque quieres dar muchas sugerencias, quieres poder ofrecer a los usuarios la oportunidad de seleccionar un precio que se ajuste a su presupuesto. De la lista de palabras clave de opciones, usa :maximum_price para filtrar las combinaciones en las que el precio de la prenda superior y de la inferior supere el precio máximo.
Si no se especifica maximum_price, el valor predeterminado debe 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}}
# ]
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.