Set a دنبالهای از مقادیر یکتا از نوع a است.
مقادیر باید از نوع comparable باشند (Int، Float، Time، Char، String و تاپلها یا لیستهایی از انواع قابل مقایسه).
میتوانید لیستها و مجموعهها را با Set.toList و Set.fromList به یکدیگر تبدیل کنید.
به دلیل ساختار داخلی Set، تضمین میشود که لیستی که از Set.fromList بهدست میآید مرتب باشد.
Set.fromList [2, 3, 3, 3, 1, 1, 2]
--> Set.fromList [1, 2, 3]
Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
--> [1, 2, 3]
میتوانید با Set.empty، Set.singleton، Set.insert و Set.remove مجموعه بسازید و آن را پر کنید.
Set.empty
--> Set.fromList []
Set.singleton "hi"
--> Set.fromList ["hi"]
eightyEight = Set.singleton 88
Set.insert 88 eightyEight
--> Set.fromList [88]
Set.insert 89 eightyEight
--> Set.fromList [88, 89]
Set.remove 88 eightyEight
--> Set.fromList []
Set.remove 89 eightyEight
--> Set.fromList [88]
میتوانید محتویات یک مجموعه را با توابع Set.member، Set.isEmpty و Set.size بررسی کنید.
Set.member 88 eightyEight
--> True
Set.isEmpty eightyEight
--> False
Set.size eightyEight
--> 1
مجموعهها را میتوان با Set.union، Set.intersect و Set.diff ترکیب کرد.
a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Set.union a b
--> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]
Set.intersect a b
--> Set.fromList [1, 10]
Set.diff a b
--> Set.fromList [100]
Set.diff b a
--> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]
میتوانید مجموعهها را فیلتر و بخشبندی کنید.
even n = modBy 2 n == 0
Set.filter even b
--> Set.fromList [2, 4, 6, 8, 10]
Set.partition even b
--> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])
نوستالژی شما برای کارتهای Blorkemon™️ هیچ نشانهای از فروکش کردن ندارد؛ حتی دوباره جمعآوریشان را شروع کردهاید و دارید دوستانتان را هم با خود همراه میکنید.
در این تمرین، یک مجموعهی Card با Set Card نمایش داده میشود، چون وقتی هدفتان به دست آوردن همهی کارتهای موجود است، کارتهای تکراری اهمیتی ندارند.
شما واقعاً میخواهید دوستانتان هم به دیوانگی Blorkemon™️ شما بپیوندند، و بهترین راه این است که با دادن یک کارت، مجموعهی آنها را راه بیندازید.
تابع newCollection را پیادهسازی کنید که یک کارت را به یک مجموعه تبدیل میکند.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
وقتی مجموعهای دارید، به زندگی خودش ادامه میدهد و باید رشد کند.
تابع addCard را پیادهسازی کنید که یک Card و یک مجموعه میگیرد و یک Tuple با دو مقدار برمیگرداند: یک Bool که نشان میدهد آیا آن Card از قبل در مجموعه بوده است، و مجموعهای که کارت به آن اضافه شده است.
addCard "Scientuna" (Set.fromList ["Newthree"])
--> (False, Set.fromList ["Newthree", "Scientuna"])
حالا که دوستانتان دوباره دیوانهی Blorkemon™️ شدهاند، میتوانید از این موقعیت برای بزرگ کردن مجموعهی خودتان با معاملهی کارتها استفاده کنید.
هر معاملهای ارزش انجام دادن ندارد، یا اصلاً نمیتواند انجام شود. کارتی را که ندارید نمیتوانید معامله کنید، و نباید کارتی را با کارتی که از قبل دارید معامله کنید.
تابع tradeCard را پیادهسازی کنید که دو کارت برای معامله (مال شما و مال آنها) و مجموعهی کنونیتان را میگیرد.
مقدار بازگشتی یک Tuple از دو مقدار است: یک Bool که مشخص میکند آیا معامله ممکن و بهصرفه است، و مجموعهای که در صورت انجام معامله به آن میرسید (حتی اگر واقعاً ممکن نباشد).
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
در یک بازار مکاره، انباری قدیمی از کارت پیدا میکنید. باید کارتها را مرتب کنید و کارتهای تکراری را حذف کنید تا فهرست را با مجموعهی خودتان مقایسه کنید.
تابع removeDuplicates را پیادهسازی کنید که فهرستی از کارتها را مرتب میکند و فهرستی از کارتهای مرتب و یکتا برمیگرداند.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
وقت آن رسیده که به مجموعهتان افتخار کنید.
تابع extraCards را پیادهسازی کنید که مجموعهی شما و مجموعهی دیگری را میگیرد و تعداد کارتهایی را برمیگرداند که مجموعهی دیگر ندارد.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
شما و دوستان علاقهمندتان به Blorkemon™️ جمع میشوید و از خودتان میپرسید کدام کارتها رایجتریناند.
تابع boringCards را پیادهسازی کنید که فهرستی از مجموعهها را میگیرد و فهرستی از کارتهای مرتبی را برمیگرداند که همهی مجموعهها دارند.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
آیا شما و دوستانتان روی هم همهی کارتهای Blorkemon™️ را دارید؟
تابع totalCards را پیادهسازی کنید که فهرستی از مجموعهها را میگیرد و تعداد کل کارتهای متفاوت در همهی مجموعهها را برمیگرداند.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
برادرزادهتان بهزودی به دیدارتان میآید و دلتان میخواهد او را تحت تأثیر قرار دهید. بچهها چیزهای براق را دوست دارند، نه؟ کارتهای Blorkemon™️ میتوانند براق باشند!
تابع splitShinyCards را پیادهسازی کنید که یک مجموعه میگیرد و یک Tuple با دو فهرست از کارتهای مرتب برمیگرداند: یکی با همهی کارتهایی که با "Shiny" شروع میشوند و یکی با بقیهی کارتها.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])