কম্প্রিহেনশন হলো Enumerables সহজে ও ডিক্লারেটিভ পদ্ধতিতে রূপান্তর করার একটি সুবিধা।
খুব সাধারণ একটি কম্প্রিহেনশন ডিক্লেয়ার করতে আমরা for কিওয়ার্ডটি ব্যবহার করতে পারি, যার পরে থাকে একটি জেনারেটর ও একটি do-block, যা এনুমারেট করা মান থেকে নতুন মান তৈরি করে।
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}]
অনলাইন ফ্যাশন বুটিক স্টোরে আপনার কাজ চলছে। আপনার মাথায় একটি ওয়েবসাইট ফিচারের ধারণা এল, যেখানে ব্যবহারকারীর কাছে একটি পোশাক-সেট সাজেস্ট করা হবে। আপনি অনেক সাজেশন দিতে চান, কিন্তু খারাপ সাজেশন দিতে চান না। তাই আপনি একটি লিস্ট কম্প্রিহেনশন ব্যবহার করার সিদ্ধান্ত নিলেন, কারণ এর মাধ্যমে সহজেই পোশাকের কম্বিনেশন জেনারেট করা যায়, তারপর কিছু মানদণ্ড অনুযায়ী সেগুলো ফিল্টার করা যায়।
পোশাকের আইটেমগুলো একটি ম্যাপে সংরক্ষণ করা হয়:
%{
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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।