Elm টাইপগুলো "একই কি না" তা সমতা অপারেটর (==) দিয়ে যাচাই করা যায়।
অসমতার অপারেটরটি (/=) (অনেক ভাষার মতো != নয়)।
সমতা অপারেটরটি লিটারাল, টাপল, রেকর্ড আর কাস্টম টাইপের ওপর কাজ করে।
1 == 2
--> False
1 /= 2
--> True
(1, 2) == (2, 1)
--> False
type alias MyRecord = { myInt : Int, myStrings : List String }
a : MyRecord
a = MyRecord (1 + 1) ["hello world"]
type alias MyOtherRecord = { myInt : Int, myStrings : List String }
myStrings = (String.join " " ["hello", "world"]) :: []
b : MyOtherRecord
b = { myInt = 2, myStrings = myStrings}
a == b
--> True
মনে রাখুন, ফাংশন কখনোই তুলনা করা উচিত নয়, কারণ তাহলে প্রোগ্রামটি রানটাইমে ক্র্যাশ করবে।
তুলনা অপারেটরগুলো (<), (<=), (>), (>=) এবং min, max, compare ফাংশনগুলো comparable টাইপের ওপর কাজ করে।
comparable একটি বিশেষ টাইপ, যা তুলনা করা যায় এমন সব বিল্ট-ইন টাইপকে এক জায়গায় করে: সংখ্যা, ক্যারেক্টার, স্ট্রিং, comparable জিনিসের তালিকা এবং comparable জিনিসের টাপল।
1 < 1 + 1
--> True
'x' < 'X'
--> False
"abc" < "abz"
--> True
"abc" < "abcd"
--> True
"abc" < "b"
--> True
min [1 , 2, 9000] [10]
--> [1 , 2, 9000]
min (1, "hello") (3, "bye")
--> (1, "hello")
রেকর্ড বা কাস্টম টাইপের মতো অন্য টাইপের মান সরাসরি তুলনা করা যায় না।
কিছু বিল্ট-ইন টাইপের ক্ষেত্রে তাদের কনটেন্ট comparable হতে হয়, যেমন Set বা Dict-এর কী (key), কারণ তাদের গঠন একটি অভ্যন্তরীণ ক্রমের ওপর নির্ভর করে।
comparable মানের তালিকা List.sort দিয়ে সাজানো যায়, আর যে মানগুলোকে comparable মানে ম্যাপ করা যায়, সেসব মানের তালিকা List.sortBy দিয়ে সাজানো যায়।
আপনার যদি স্তরভিত্তিক সাজানো দরকার হয় (একটি বৈশিষ্ট্য অনুযায়ী সাজানো, আর সমতা থাকলে অন্যটি দিয়ে ভাঙা), তাহলে List.sortBy-এর সাথে টাপল বা তালিকাও ব্যবহার করতে পারেন, কারণ টাপল আর তালিকা লেক্সিকোগ্রাফিক ক্রমে সাজানো হয়।
List.sort ["hi", "hello", "bye", "goodbye"]
--> ["bye", "goodbye", "hello", "hi"]
List.sortBy String.length ["hi", "hello", "bye", "goodbye"]
--> ["hi", "bye", "hello", "goodbye"]
-- sort by length, then alphabetically
List.sortBy (\str -> (String.length str, str)) ["hi", "mum", "hello", "sis", "bye", "dad"]
--> ["hi", "bye", "dad", "mum", "sis", "hello"]
compare ফাংশনটি দুটি comparable মান নেয় এবং একটি Order রিটার্ন করে।
Order এমন একটি টাইপ, যা একটিমাত্র অপারেশনে দেখে দেয় একটি মান অন্য একটি মানের চেয়ে বড় (GT), সমান (EQ) নাকি ছোট (LT)।
compare 1 2
--> LT
compare "" ""
--> EQ
compare [12] []
--> GT
যেকোনো টাইপের জন্য তুলনা ফাংশন বানিয়ে ব্যবহার করা যায়, যেমন List.sortWith দিয়ে সাজানোর জন্য:
type Color = Red | Green | Blue
compareColors : Color -> Color -> Order
compareColors a b =
case (a, b) of
(Red, Red) -> EQ
(Red, _) -> LT
(_, Red) -> GT
(Green, Green) -> EQ
(Green, _) -> LT
(_, Green) -> GT
(Blue, Blue) -> EQ
List.sortWith compareColors [Blue, Red, Green, Green, Blue]
--> [Red, Green, Green, Blue, Blue]
হঠাৎই আপনার মন নস্টালজিয়ায় ভরে যায়, আর পুরোনো Blorkemon™️ কার্ডগুলো ধুলো ঝেড়ে বের করার প্রবল ইচ্ছা জাগে।
Blorkemon™️ কার্ড একটি দারুণ, পুরোনো ঘরানার কার্ড ট্রেডিং গেম।
প্রতিটি Card-এ একটি Blorkemon™️ মনস্টার আঁকা থাকে, সঙ্গে থাকে আক্রমণ শক্তির মাত্রা, আর ভাগ্য সহায় হলে কার্ডটি চকচকেও হতে পারে।
প্রতিটি Blorkemon™️ কার্ড পরেরটির চেয়ে বেশি শক্তিশালী মনে হয়, তবে ভালো করে যাচাই করে নেওয়াই ভালো।
isMorePowerful ফাংশনটি লিখুন। এর প্রথম আর্গুমেন্টের কার্ডটি যদি অন্যটির চেয়ে সত্যিকারভাবে বেশি শক্তিশালী হয়, তবে এটি True রিটার্ন করবে, নাহলে False.
newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True
isMorePowerful newthree scientuna
--> True
হাতে একগুচ্ছ Blorkemon™️ কার্ড থাকলে আপনি সবচেয়ে ভয়ংকর আক্রমণ তৈরি করতে পারবেন।
maxPower ফাংশনটি লিখুন, যা দুটি কার্ডের মধ্যে সর্বোচ্চ শক্তির মাত্রা রিটার্ন করে।
maxPower newthree scientuna
--> 120
মনে হচ্ছে আপনার প্রতিটি Blorkemon™️-এর অন্তত একটি করে কার্ড ছিল, তবে শেষবার দেখার পর অনেকদিন পেরিয়ে গেছে। Pulpapedia-র অফিসিয়াল তালিকার সঙ্গে মিলিয়ে দেখতে আপনার কার্ডগুলো সাজিয়ে নেওয়া উচিত।
sortByMonsterName ফাংশনটি লিখুন, যা Cards-এর একটি অ্যারে নেবে এবং মনস্টারের নাম অনুসারে সাজানো একটি অ্যারে রিটার্ন করবে।
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
Blorkemon™️ হলো পৃথিবীর সবচেয়ে কুল জিনিস। এই কথাটা আপনি হালকাভাবে বলছেন না, এটা প্রমাণ করার জন্য আপনার হাতে একটি বৈজ্ঞানিক পদ্ধতি আছে।
sortByCoolness ফাংশনটি লিখুন, যা কার্ডের একটি অ্যারে সাজায় এবং সবচেয়ে কুল কার্ডগুলোকে প্রথমে রাখে।
একটি কার্ড কতটা কুল, তা প্রথমে নির্ধারিত হয় তার চকচকেভাব দিয়ে: যেসব কার্ড চকচকে, সেগুলো বাকিগুলোর চেয়ে অনেক বেশি কুল।
দ্বিতীয় বিষয়টি শক্তির মাত্রা, যত বেশি তত ভালো।
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
চকচকেভাব শুধু দেখানোর জন্য নয়, সমান শক্তির দুই Blorkemon™️-এর লড়াইয়ে চকচকে কার্ডটি সবসময় জিতে যাবে। একেই বলা হয় চকচকে শক্তি।
compareShinyPower ফাংশনটি লিখুন, যা এই বৈশিষ্ট্যটিকে নিয়মে বেঁধে দেয়।
দুটি কার্ডের শক্তির মাত্রা আলাদা হলে সেই শক্তির মাত্রা দিয়েই Order নির্ধারিত হয়, কিন্তু দুটো সমান হলে চকচকে কার্ডটিই বড় হিসেবে বিবেচিত হবে।
compareShinyPower newthree scientuna
--> GT
Blorkemon™️ কার্ডের গেমে যা খুশি হতে পারে, তবুও বেশি শক্তিশালী কার্ডের জেতার প্রবণতা থাকে।
expectedWinner ফাংশনটি লিখুন, যা compareShinyPower-এর ক্রম অনুসারে জেতার সম্ভাবনা সবচেয়ে বেশি এমন মনস্টারের নাম রিটার্ন করে।
ফাংশনটি প্রত্যাশিত বিজয়ী মনস্টারের নাম রিটার্ন করবে, আর দুই প্রতিদ্বন্দ্বীর চকচকে শক্তি সমান হলে রিটার্ন করবে "too close to call".
expectedWinner newthree scientuna
--> "Newthree"
Exercism-এ সাইন আপ করুন, Elm ট্র্যাকের 28টি কনসেপ্ট110টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।