Az Elm típusoknál az „ugyanaz-e” kérdés a (==) egyenlőségoperátorral ellenőrizhető.
A nem egyenlőség operátora a (/=) (nem !=, mint sok más nyelvben).
Az egyenlőségoperátor literálokon, tuple-okon, rekordokon és egyedi típusokon működik.
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
Vedd figyelembe, hogy függvényeket soha ne hasonlíts össze, mert ettől a program futásidőben összeomlik.
A (<), (<=), (>), (>=) összehasonlító operátorok és a min, max, compare függvények comparable típusokon működnek.
A comparable típus egy speciális típus, amely az összes beépített, összehasonlítható típust csoportosítja: számokat, karaktereket, stringeket, összehasonlítható dolgok listáit és összehasonlítható dolgokból álló tuple-okat.
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")
Más típusok értékei, például a rekordok vagy az egyedi típusok, nem hasonlíthatók össze közvetlenül.
Néhány beépített típus megköveteli, hogy a tartalma comparable legyen, például a Set vagy a Dict kulcsaié, mert a szerkezetük belső sorrendezésre támaszkodik.
A comparable értékek listái a List.sort függvénnyel rendezhetők, és az olyan értékek listái, amelyek leképezhetők comparable értékekre, a List.sortBy függvénnyel rendezhetők.
Ha hierarchikus rendezésre van szükséged (egy tulajdonság szerint rendezel, a holtversenyeket pedig egy másikkal döntöd el), a List.sortBy függvénnyel is használhatók tuple-ok vagy listák, mert a tuple-ok és a listák lexikográfiai sorrendben rendeződnek.
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"]
A compare függvény két comparable értéket vesz fel, és egy Order értéket ad vissza.
Az Order egy olyan típus, amely egyetlen műveletben eldönti, hogy egy érték nagyobb (GT), egyenlő (EQ) vagy kisebb (LT), mint egy másik.
compare 1 2
--> LT
compare "" ""
--> EQ
compare [12] []
--> GT
Összehasonlító függvények tetszőleges típusokhoz is készíthetők, és például arra használhatók, hogy a List.sortWith függvénnyel rendezzünk velük:
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]
Hirtelen nosztalgiahullám tör rád, és erős késztetést érzel, hogy leporold a régi Blorkemon™️ kártyáidat.
A Blorkemon™️ kártyák egy nagyszerű, régi vágású kártyacsere-játék.
Minden Card-on egy Blorkemon™️ szörny látható, egy támadási erőszinttel együtt, és ha szerencséd van, a kártya akár fényes is lehet.
Mindegyik Blorkemon™️ kártya erősebbnek tűnik a másiknál, de jobb, ha ellenőrzöd.
Implementáld az isMorePowerful függvényt. Térjen vissza True-val, ha az első argumentumában lévő kártya szigorúan erősebb a másiknál, egyébként pedig False-szal.
newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True
isMorePowerful newthree scientuna
--> True
Egy marék Blorkemon™️ kártyával a kezedben felkészülhetsz a legpusztítóbb támadásra.
Implementáld a maxPower függvényt, amely két kártya közül a nagyobb erőszintet adja vissza.
maxPower newthree scientuna
--> 120
Úgy emlékszel, hogy legalább egy kártyád volt minden Blorkemon™️-ból, de már jó ideje nem ellenőrizted; rendezd a kártyáidat, hogy összevesd őket a Pulpapedia hivatalos listájával.
Implementáld a sortByMonsterName függvényt, amely kap egy Cards listát, és a szörnynevek szerint rendezett listát ad vissza.
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
A Blorkemon™️ a valaha volt legmenőbb dolog. Nem használod ezt a kifejezést könnyelműen, tudományos módszered van rá, hogy bebizonyítsd.
Implementáld a sortByCoolness függvényt, amely úgy rendezi a kártyák listáját, hogy a legmenőbbek kerüljenek előre.
Egy kártya menőségét elsősorban a fényessége határozza meg: minden fényes kártya sokkal menőbb a többinél.
A második tényező az erőszint: minél nagyobb, annál jobb.
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
A fényesség nem csak dísz: az azonos erejű Blorkemon™️-ok csatájában mindig a fényes kerekedik felül. Ezt nevezik fényes erőnek.
Implementáld a compareShinyPower függvényt, amely ezt a tulajdonságot foglalja szabályba.
Két kártya Order-jét az erőszintek határozzák meg, ha azok eltérnek, de ha egyenlők, akkor a fényes kártya lesz a nagyobb.
compareShinyPower newthree scientuna
--> GT
A Blorkemon™️ kártyajátékban bármi megtörténhet, de azért mégiscsak az erősebb kártyák győznek gyakrabban.
Implementáld az expectedWinner függvényt, amely annak a szörnynek a nevét adja vissza, amelyik a legvalószínűbben győz, a compareShinyPower szerinti rendezés alapján.
A függvény az esélyes győztes szörny nevét adja vissza, vagy „too close to call”, ha mindkét ellenfél fényes ereje ugyanakkora.
expectedWinner newthree scientuna
--> "Newthree"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elm nyelvet 28 fogalom110 feladat segítségével, valódi emberi mentorálással, mindez ingyen.