I tipi di Elm possono essere controllati per «essere uguali» con l'operatore di uguaglianza (==).
L'operatore di disuguaglianza è (/=) (non != come in molti linguaggi).
L'operatore di uguaglianza funziona su letterali, tuple, record e tipi personalizzati.
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
Tieni presente che non dovresti mai confrontare le funzioni, perché così il programma andrà in crash a runtime.
Gli operatori di confronto (<), (<=), (>), (>=) e le funzioni min, max, compare funzionano con i tipi comparable.
Il tipo comparable è un tipo speciale che raggruppa tutti i tipi predefiniti che si possono confrontare: numeri, caratteri, stringhe, liste di elementi comparabili e tuple di elementi comparabili.
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")
I valori di altri tipi, come i record o i tipi personalizzati, non possono essere confrontati direttamente.
Alcuni tipi predefiniti richiedono che il loro contenuto sia comparable, come le chiavi di Set o Dict, poiché la loro struttura si basa su un ordinamento interno.
Le liste di valori comparable possono essere ordinate con List.sort e le liste di valori che possono essere mappati a valori comparabili possono essere ordinate con List.sortBy.
Se hai bisogno di un ordinamento gerarchico (ordina per una proprietà e risolvi i pareggi con un'altra), anche tuple o liste possono essere usate con List.sortBy, poiché tuple e liste vengono ordinate in ordine lessicografico.
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"]
La funzione compare prende due valori comparable e restituisce un Order.
Un Order è un tipo che permette di verificare in una sola operazione se un valore è maggiore (GT), uguale (EQ) o minore (LT) di un altro.
compare 1 2
--> LT
compare "" ""
--> EQ
compare [12] []
--> GT
Le funzioni di confronto possono essere costruite per tipi arbitrari e usate, per esempio, per ordinare con 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]
Ti senti improvvisamente assalire da un'ondata di nostalgia e da una forte voglia di rispolverare le tue vecchie carte Blorkemon™️.
Blorkemon™️ cards è un fantastico gioco di scambio carte in stile old school.
Ogni Card ha un mostro Blorkemon™️ disegnato sopra, insieme a un livello di potenza d'attacco, e se sei fortunato, la carta potrebbe persino essere lucente.
Ogni carta Blorkemon™️ sembra più potente della successiva, ma è meglio controllare.
Implementa la funzione isMorePowerful. Dovrebbe restituire True se la carta passata come primo argomento è strettamente più potente dell'altra, e False altrimenti.
newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True
isMorePowerful newthree scientuna
--> True
Con una mano piena di carte Blorkemon™️, dovresti riuscire a preparare l'attacco più devastante.
Implementa la funzione maxPower, che restituisce il livello di potenza più alto tra due carte.
maxPower newthree scientuna
--> 120
A quanto pare ricordi di avere almeno una carta di ogni Blorkemon™️, ma è passato un po' di tempo dall'ultima volta che hai controllato: dovresti ordinare le tue carte per confrontarle con l'elenco ufficiale su Pulpapedia.
Implementa la funzione sortByMonsterName, che dovrebbe prendere un array di Cards e restituire un array ordinato per nomi dei mostri.
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
I Blorkemon™️ sono la cosa più cool di sempre. Non stai usando quel termine alla leggera: hai un metodo scientifico per dimostrarlo.
Implementa la funzione sortByCoolness, che ordina un array di carte mettendo per prime le più cool.
Il grado di cool di una carta è determinato prima di tutto dalla sua lucentezza: tutte le carte lucenti sono decisamente più cool delle altre.
Il secondo fattore è il livello di potenza: più è alto, meglio è.
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
La lucentezza non è solo apparenza: in una battaglia tra Blorkemon™️ di pari potenza, uno lucente avrà sempre la meglio. Questo si chiama potere lucente.
Implementa la funzione compareShinyPower, che codifica questa proprietà.
L'Order di due carte è determinato dai livelli di potenza se sono diversi, ma se sono uguali, una carta lucente sarà maggiore.
compareShinyPower newthree scientuna
--> GT
In una partita a carte Blorkemon™️, tutto può succedere, ma le carte più potenti tendono comunque a vincere.
Implementa la funzione expectedWinner che restituisce il nome del mostro che ha più probabilità di vincere, in base all'ordinamento di compareShinyPower.
La funzione dovrebbe restituire il nome del mostro vincitore previsto, oppure «too close to call» se entrambi gli avversari hanno lo stesso potere lucente.
expectedWinner newthree scientuna
--> "Newthree"
Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.