প্যাটার্ন ম্যাচিং দিয়ে ভাব প্রকাশ করতে সক্ষম শাখাপ্রবণ কোড লেখা যায়, আর ডিস্ট্রাকচারিং মানকে ভ্যারিয়েবলে সুন্দরভাবে বেঁধে দেয়।
case স্টেটমেন্ট ব্যবহার করে প্যাটার্ন ম্যাচিং মানকে ভ্যারিয়েবলে বাঁধতে পারে, আবার ওয়াইল্ডকার্ড _ দিয়ে সেগুলো ফেলে দিতে পারে।
type Entity = Alien | Stranger (Maybe String) | Friend { name: String }
hello : Entity -> String
hello entity =
case entity of
-- Custom type variant
Alien -> "Hello, you are not from around here are you?"
-- Binding to a litteral value nested in Stranger
Stranger (Just nametag) -> "Hello, erm... " ++ nametag ++ "."
-- Discarding Friend's data
Friend _ -> "Hi!"
-- All other cases
_ -> "Hello stranger!"
ডেটার কেবল একটি আকারই সম্ভব হলে, ডিস্ট্রাকচারিং let বাইন্ডিং, ফাংশনের আর্গুমেন্ট এবং অবশ্যই case এক্সপ্রেশনে মান বাঁধতে পারে।
pairSum : ( Int, Int ) -> Int
pairSum pair =
-- Destructuring of a pair in a 'let' binding
let ( x, y ) = pair
in x + y
-- Destructuring in the function argument
pairSum : ( Int, Int ) -> Int
pairSum ( x, y ) = x + y
-- Custom type containing a single variant
type Container = Box String
-- Destructuring in the function argument
unbox : Container -> String
unbox (Box str) = str
-- Destructuring combined with pattern matching
unboxMaybe : Maybe Container -> Maybe String
unboxMaybe maybeContainer =
case maybeContainer of
Nothing -> Nothing
Just (Box "42") -> Just "The answer to the universe!"
Just (Box str) -> Just str
ডিস্ট্রাকচারিং রেকর্ড-এর ক্ষেত্রেও ব্যবহার করা যায়, কিংবা as কিওয়ার্ড দিয়েও।
type alias Circle =
{ radius : Float
, center : ( Float, Float )
}
perimeter : Circle -> Float
perimeter { radius } =
2 * pi * radius
left : Circle -> Float
left { radius, center } =
-- the pair center cannot be pattern matched directly in the function argument
-- so we do it in a 'let' statement
let ( x, _ ) = center
in x - radius
-- using the 'as' keyword to bind both the fields and the whole record
smaller : Float -> Circle -> Circle
smaller reduction ({ radius } as circle) =
if reduction < radius then
{ circle | radius = radius - reduction }
else
circle
আপনি IT হেল্পডেস্কের একজন সদস্য, আর আপনি টিকিটিং সিস্টেমটিকে আরও দক্ষ করে তুলতে এবং আপনার ম্যানেজারের জন্য পরিসংখ্যান দিতে চান।
একটি টিকিটের একটি স্টেটাস থাকে (নিউ, ইন প্রোগ্রেস...), একটি ইউজারনেম ও একটি কর্মী আইডি দিয়ে চিহ্নিত একজন নির্মাতা থাকে, টিকিটটি একজন IT কর্মীকে অ্যাসাইন করা যায় এবং এতে কমেন্টের একটি ইতিহাস থাকে।
নিচে চারটি কাজ দেওয়া হলো, যা আপনার বর্তমান টিকিটিং সিস্টেমকে আরও উন্নত করবে।
ফাঁকা কমেন্ট ইন্টারফেসে অপ্রয়োজনীয় ভিড় তৈরি করে আর কোনো তথ্যও দেয় না, তাই আপনি সেগুলো ফিল্টার করে বাদ দিতে চান।
এমন একটি হেল্পার ফাংশন emptyComment ডিফাইন করুন যা একটি ইউজার/কমেন্ট জোড়া নেয় এবং ফাঁকা কমেন্টের জন্য True রিটার্ন করে।
ফাংশনের আর্গুমেন্টেই ডিস্ট্রাকচারিং ব্যবহার করে ইউজার ও কমেন্টটি বের করে নিন। ইউজারের তথ্য আপনার দরকার নেই, তাই সেটি উপেক্ষা করুন।
emptyComment ( User "Alice", "" )
-- => True
টিকিট প্রক্রিয়ায় ইউজারদের অংশগ্রহণ নিয়ে আপনার ম্যানেজার পরিসংখ্যান চান। টিকিটের নির্মাতা কতগুলো কমেন্ট যোগ করেছেন তা যাচাই করতে তিনি আপনাকে অনুরোধ করেন।
এমন একটি numberOfCreatorComments ডিফাইন করুন যা একটি টিকিট নেয় এবং টিকিটের নির্মাতা কতগুলো কমেন্ট যোগ করেছেন সেই সংখ্যা রিটার্ন করে।
ফাংশনের আর্গুমেন্টে ডিস্ট্রাকচারিং ব্যবহার করে Ticket টাইপ থেকে রেকর্ডটি এবং একইসাথে রেকর্ড থেকে আপনার প্রয়োজনীয় ফিল্ডগুলো বের করে নিন।
এরপর একটি let বাইন্ডিংয়ে createdBy ডিস্ট্রাকচার করুন, যাতে প্রাসঙ্গিক কমেন্টগুলো গণনা করতে পারেন।
গণনার কাজে List ফাংশন ব্যবহার করুন এবং ইউজার/কমেন্ট জোড়াটি আলাদা করতে একটি অ্যানোনিমাস ফাংশনের আর্গুমেন্টে ডিস্ট্রাকচারিং ব্যবহার করুন।
numberOfCreatorComments
numberOfCreatorComments
(Ticket
{ status = Closed
, createdBy = ( User "Chiaki", 1 )
, assignedTo = Nothing
, comments = [ ( User "Chiaki", "Never mind, fixed it." ) ]
}
)
-- => 1
কিছু টিকিট Dev Team-এর Alice, Bob বা Charlie-এর কাছে এস্কেলেট করতে হয়। সেগুলো যে এগিয়ে চলছে তা নিশ্চিত করতে সেদিকে নজর রাখা জরুরি।
এমন একটি হেল্পার ফাংশন assignedToDevTeam ডিফাইন করুন যা যাচাই করে টিকিটটি Dev Team-এর কোনো এক সদস্যকে অ্যাসাইন করা হয়েছে কি না।
ফাংশনের আর্গুমেন্টে ডিস্ট্রাকচারিং ব্যবহার করে Ticket টাইপ থেকে রেকর্ডটি এবং আপনার প্রয়োজনীয় ফিল্ডটিও বের করে নিন।
এরপর একটি একক case স্টেটমেন্ট ব্যবহার করে যাচাই করুন টিকিটটি Alice, Bob বা Charlie-এর কেউ একজনকে অ্যাসাইন করা কি না, যেখানে রিকার্সিভ প্যাটার্ন ম্যাচিং দিয়ে তাঁদের ইউজারনেম বের করবেন এবং লিটারাল প্যাটার্ন ম্যাচিং দিয়ে তাঁদের মিলিয়ে দেখবেন।
assignedToDevTeam
(Ticket
{ status = InProgress
, createdBy = ( User "Bill", 2 )
, assignedTo = Just (User "Alice")
, comments = [ ( User "Bill", "What's an 'undefined'?" ) ]
}
)
-- => True
কখনো কখনো অনেক টিকিট অন্য IT কর্মীদের কাছে পুনরায় অ্যাসাইন করতে হয়।
এটি করতে সাহায্য করবে এমন একটি ফাংশন assignTicketTo ডিফাইন করুন। ফাংশনটি দুটি আর্গুমেন্ট নেয়: যে ইউজারকে টিকিটটি অ্যাসাইন করা হবে সেই ইউজার এবং একটি টিকিট।
টিকিটের স্টেটাস New হলে সেটি নতুন ইউজারকে অ্যাসাইন করুন এবং স্টেটাসটি বদলে InProgress করে দিন।
অন্য স্টেটাসের ক্ষেত্রে সাধারণভাবে টিকিটটি নতুন ইউজারকে পুনরায় অ্যাসাইন করুন; তবে Archived স্টেটাসের টিকিট একেবারেই পরিবর্তন করা উচিত নয়।
ফাংশনের আর্গুমেন্টে ডিস্ট্রাকচারিং ব্যবহার করে Ticket টাইপ থেকে রেকর্ডটি এবং আপনার প্রয়োজনীয় ফিল্ডটি বের করে নিন, আর সাথে as কিওয়ার্ড ব্যবহার করে পুরো রেকর্ডটি যেমন আছে তেমনই ধরে রাখুন।
একটি একক case স্টেটমেন্ট ব্যবহার করে স্টেটাসের ওপর প্যাটার্ন ম্যাচ করুন এবং উপযুক্ত টিকিটটি রিটার্ন করুন, যা as কিওয়ার্ড দিয়ে ধরে রাখা মূল রেকর্ডটি পরিবর্তন করে তৈরি করা হয়।
assignTicketTo (User "Danny")
(Ticket
{ status = New
, createdBy = ( User "Jesse", 3 )
, assignedTo = Just (User "Alice")
, comments = [ ( User "Jesse", "I've been waiting for 6 months!!" ) ]
}
)
-- => Ticket
-- { status = InProgress
-- , createdBy = ( User "Jesse", 3 )
-- , assignedTo = Just (User "Danny")
-- , comments = [ ( User "Jesse", "I've been waiting for 6 months!!" ) ]
-- }
Exercism-এ সাইন আপ করুন, Elm ট্র্যাকের 28টি কনসেপ্ট110টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।