درک لیست ابزاری برای تبدیل «Enumerables» به شکلی آسان و اعلانی فراهم میکند.
برای تعریف یک درک لیست بسیار ساده، از کلیدواژهی for استفاده میکنیم که پس از آن یک «مولد» و یک بلوک do میآید؛ بلوک 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» استفاده کنید، چون با آن میتوانید بهراحتی ترکیبهای ست لباس را تولید کنید و سپس آنها را بر اساس برخی معیارها فیلتر کنید.
اقلام لباس بهصورت یک map ذخیره میشوند:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
تابع get_combinations/3 را پیادهسازی کنید تا یک لیست از بالاتنهها، یک لیست از پایینتنهها و یک لیست کلیدواژهای از گزینهها بگیرد. فعلاً options را طوری تنظیم کنید که بهصورت پیشفرض یک لیست کلیدواژهای خالی باشد. این تابع باید حاصلضرب دکارتی این لیستها را برگرداند.
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}}
# ]