Включення дають змогу легко й декларативно перетворювати Enumerable-структури.
Щоб оголосити найпростіше включення, скористаймося ключовим словом for, після якого йде генератор і блок do, що створює нові значення з перелічених.
for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]
Включення також можуть мати фільтри. Значення, які не проходять фільтр, не потрапляють до фінального масиву:
for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]
Складніші включення можна оголошувати в кілька рядків:
for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
rem(number, 2) == 0 do
atom
end
# => [:b, :d]
Декартів добуток можна створити за допомогою кількох генераторів. Це означає, що кожне значення, яке породив перший генератор, утворить пару з кожним значенням, яке породив другий генератор:
for x <- [0, 1],
y <- [0, 1] do
{x, y}
end
# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]
Ми продовжуємо працювати в інтернет-магазині модного одягу. У нас виникає ідея нової можливості на сайті, де користувачеві пропонується готовий образ. Ми хочемо давати багато пропозицій, але не хочемо давати поганих, тож вирішуємо скористатися list comprehension, адже так можна легко генерувати комбінації образів, а потім фільтрувати їх за певними критеріями.
Предмети одягу зберігаються у вигляді мапи:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
Реалізуйте get_combinations/3, яка приймає список верхів, список низів і список ключових слів з опціями. Поки що зробіть типовим значенням опцій порожній список ключових слів. Функція повинна повертати декартів добуток цих списків.
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"}}
# ]
Кожен предмет одягу має поле :base_color. Скористайтеся цим полем, щоб відфільтрувати всі комбінації, де верх і низ мають однаковий базовий колір.
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"}}
# ]
З кожним предметом одягу повʼязане поле :price. Ми хочемо давати багато пропозицій, але й хочемо дати користувачам змогу вибрати ціну в межах свого бюджету. Зі списку ключових слів з опціями скористайтеся :maximum_price, щоб відфільтрувати комбінації, де ціна верху й низу перевищує максимальну ціну.
Якщо maximum_price не вказано, типовим значенням має бути 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}}
# ]
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.