Mit dem Gleichheitsoperator (==) kannst du bei Elm-Typen prüfen, ob sie „gleich" sind.
Der Ungleichheitsoperator ist (/=) (nicht != wie in vielen Sprachen).
Der Gleichheitsoperator funktioniert mit Literalen, Tupeln, Records und eigenen Typen.
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
Beachte, dass du niemals Funktionen vergleichen solltest, da das Programm sonst zur Laufzeit abstürzt.
Die Vergleichsoperatoren (<), (<=), (>), (>=) und die Funktionen min, max, compare arbeiten mit comparable-Typen.
Der Typ comparable ist ein spezieller Typ, der alle eingebauten Typen zusammenfasst, die sich vergleichen lassen: Zahlen, Zeichen, Strings, Listen vergleichbarer Dinge und Tupel vergleichbarer Dinge.
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")
Werte anderer Typen wie Records oder eigene Typen lassen sich nicht direkt vergleichen.
Bei manchen eingebauten Typen müssen die Inhalte comparable sein, etwa die Schlüssel von Set oder Dict, da ihre Struktur auf einer internen Ordnung beruht.
Listen mit comparable-Werten lassen sich mit List.sort sortieren, und Listen von Werten, die sich auf vergleichbare Werte abbilden lassen, mit List.sortBy.
Wenn du eine hierarchische Sortierung brauchst (nach einer Eigenschaft sortieren und bei Gleichstand eine andere entscheiden lassen), kannst du ebenfalls Tupel oder Listen mit List.sortBy verwenden, da Tupel und Listen in lexikografischer Reihenfolge sortiert werden.
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"]
Die Funktion compare nimmt zwei comparable-Werte und gibt eine Order zurück.
Eine Order ist ein Typ, der in einem einzigen Schritt prüft, ob ein Wert größer (GT), gleich (EQ) oder kleiner (LT) als ein anderer ist.
compare 1 2
--> LT
compare "" ""
--> EQ
compare [12] []
--> GT
Vergleichsfunktionen lassen sich für beliebige Typen erstellen und zum Beispiel mit List.sortWith zum Sortieren verwenden:
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]
Du spürst plötzlich einen Anflug von Nostalgie und einen starken Drang, deine alten Blorkemon™️-Karten abzustauben.
Blorkemon™️-Karten sind ein großartiges, altes Sammelkartenspiel.
Auf jeder Card ist ein Blorkemon™️-Monster abgebildet, dazu eine Angriffskraftstufe, und wenn du Glück hast, ist die Karte sogar glänzend.
Jede Blorkemon™️-Karte sieht stärker aus als die nächste, aber das solltest du besser überprüfen.
Implementiere die Funktion isMorePowerful. Sie soll True zurückgeben, wenn die Karte im ersten Argument strikt stärker ist als die andere, und sonst False.
newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True
isMorePowerful newthree scientuna
--> True
Mit einer Hand voller Blorkemon™️-Karten solltest du den verheerendsten Angriff vorbereiten können.
Implementiere die Funktion maxPower, die die höchste Kraftstufe zweier Karten zurückgibt.
maxPower newthree scientuna
--> 120
Du scheinst dich zu erinnern, dass du mindestens eine Karte von jedem Blorkemon™️ hattest, aber es ist eine Weile her, seit du das letzte Mal nachgesehen hast. Du solltest deine Karten sortieren, um sie mit der offiziellen Auflistung auf Pulpapedia zu vergleichen.
Implementiere die Funktion sortByMonsterName, die eine Liste von Cards entgegennimmt und eine nach Monsternamen sortierte Liste zurückgibt.
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
Blorkemon™️ sind das Coolste überhaupt. Das sagst du nicht leichtfertig, du hast eine wissenschaftliche Methode, um es zu beweisen.
Implementiere die Funktion sortByCoolness, die eine Liste von Karten sortiert und dabei die coolsten zuerst platziert.
Die Coolness einer Karte wird zuerst durch ihren Glanz bestimmt: Alle glänzenden Karten sind viel cooler als die anderen.
Der zweite Faktor ist die Kraftstufe, je höher, desto besser.
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
Glanz ist nicht nur Show: In einem Kampf zwischen gleich starken Blorkemon™️ gewinnt immer das glänzende. Das nennt man die Glanzkraft.
Implementiere die Funktion compareShinyPower, die diese Eigenschaft festhält.
Die Order zweier Karten wird durch die Kraftstufen bestimmt, wenn diese unterschiedlich sind. Sind sie jedoch gleich, ist eine glänzende Karte größer.
compareShinyPower newthree scientuna
--> GT
In einem Spiel mit Blorkemon™️-Karten ist alles möglich, aber stärkere Karten gewinnen trotzdem tendenziell eher.
Implementiere die Funktion expectedWinner, die den Namen des Monsters zurückgibt, das am wahrscheinlichsten gewinnt, bestimmt durch die Reihenfolge von compareShinyPower.
Die Funktion soll den Monsternamen des erwarteten Gewinners zurückgeben, oder „too close to call“, wenn beide Gegner dieselbe Glanzkraft haben.
expectedWinner newthree scientuna
--> "Newthree"
Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.