Se puede comprobar si dos valores de tipos de Elm «son lo mismo» con el operador de igualdad (==).
El operador de desigualdad es (/=) (no != como en muchos lenguajes).
El operador de igualdad funciona con literales, tuplas, registros y tipos personalizados.
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
Ten en cuenta que nunca deberías comparar funciones, ya que esto hará que el programa falle en tiempo de ejecución.
Los operadores de comparación (<), (<=), (>), (>=) y las funciones min, max, compare funcionan con tipos comparable.
El tipo comparable es un tipo especial que agrupa todos los tipos integrados que se pueden comparar: números, caracteres, strings, arrays de elementos comparables y tuplas de elementos comparables.
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")
Los valores de otros tipos, como los registros o los tipos personalizados, no se pueden comparar directamente.
Algunos tipos integrados requieren que su contenido sea comparable, como las claves de Set o Dict, ya que su estructura depende de un orden interno.
Los arrays de valores comparable se pueden ordenar con List.sort, y los arrays de valores que se pueden mapear a valores comparables se pueden ordenar con List.sortBy.
Si necesitas una ordenación jerárquica (ordenar por una propiedad y desempatar con otra), también puedes usar tuplas o arrays con List.sortBy, ya que las tuplas y los arrays se ordenan en orden lexicográfico.
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 función compare toma dos valores comparable y devuelve un Order.
Un Order es un tipo que comprueba en una sola operación si un valor es mayor (GT), igual (EQ) o menor (LT) que otro.
compare 1 2
--> LT
compare "" ""
--> EQ
compare [12] []
--> GT
Se pueden construir funciones de comparación para tipos arbitrarios y usarlas, por ejemplo, para ordenar 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]
De repente sientes un arrebato de nostalgia y unas ganas enormes de desempolvar tus viejas cartas Blorkemon™️.
Las cartas Blorkemon™️ son un gran juego de intercambio de cartas de la vieja escuela.
Cada Card tiene dibujado un monstruo Blorkemon™️, junto con un nivel de potencia de ataque y, si tienes suerte, puede que la carta sea incluso brillante.
Cada carta Blorkemon™️ parece más poderosa que la anterior, pero más vale que lo compruebes.
Implementa la función isMorePowerful. Debe devolver True si la carta de su primer argumento es estrictamente más poderosa que la otra, y False en caso contrario.
newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True
isMorePowerful newthree scientuna
--> True
Con una mano llena de cartas Blorkemon™️, deberías poder preparar el ataque más devastador.
Implementa la función maxPower, que devuelve el nivel de potencia más alto de dos cartas.
maxPower newthree scientuna
--> 120
Parece que recuerdas que tenías al menos una carta de cada Blorkemon™️, pero hace tiempo que no lo compruebas, así que deberías ordenar tus cartas para compararlas con el listado oficial de Pulpapedia.
Implementa la función sortByMonsterName, que debe tomar un array de Cards y devolver un array ordenado por nombres de monstruo.
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
Los Blorkemon™️ son lo más guay que existe. No usas ese término a la ligera: tienes un método científico para demostrarlo.
Implementa la función sortByCoolness, que ordena un array de cartas colocando primero las más guays.
Lo guay de una carta viene determinado primero por si es brillante: todas las cartas brillantes son mucho más guays que las demás.
El segundo factor es el nivel de potencia: cuanto más alto, mejor.
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
Ser brillante no es solo por estética: en una batalla entre Blorkemon™️ con el mismo poder, uno brillante siempre se impone. A esto se le llama el Poder brillante.
Implementa la función compareShinyPower, que codifica esta propiedad.
El Order de dos cartas viene determinado por los niveles de potencia si son distintos, pero si son iguales, una carta brillante será mayor.
compareShinyPower newthree scientuna
--> GT
En una partida de cartas Blorkemon™️ todo vale, pero sigue habiendo una tendencia a que ganen las cartas más poderosas.
Implementa la función expectedWinner, que devuelve el nombre del monstruo con más probabilidades de ganar, según el orden que determina compareShinyPower.
La función debe devolver el nombre del monstruo ganador esperado, o "too close to call" si ambos oponentes tienen el mismo Poder brillante.
expectedWinner newthree scientuna
--> "Newthree"
Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.