Puedes comprobar si dos valores 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, records 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 debes 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, listas de cosas comparables y tuplas de cosas 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 records 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.
Las listas de valores comparable se pueden ordenar con List.sort, y las listas de valores que se pueden transformar en 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 listas con List.sortBy, ya que las tuplas y las listas 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 de Blorkemon™️. Las cartas de 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 poder de ataque y, si tienes suerte, la carta hasta podría ser brillante.
Cada carta de Blorkemon™️ parece más poderosa que la anterior, pero es mejor que lo verifiques.
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 de Blorkemon™️, deberías poder preparar el ataque más devastador.
Implementa la función maxPower, que devuelve el nivel de poder más alto de dos cartas.
maxPower newthree scientuna
--> 120
Parece que recuerdas que tenías al menos una carta de cada Blorkemon™️, pero ha pasado bastante tiempo desde la última vez que lo revisaste; deberías ordenar tus cartas para compararlas con el listado oficial de Pulpapedia.
Implementa la función sortByMonsterName, que debe tomar una lista de Cards y devolver una lista ordenada por los nombres de los monstruos.
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
Los Blorkemon™️ son lo más genial 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 una lista de cartas colocando primero las más geniales. La genialidad de una carta se determina primero por su brillo: todas las cartas brillantes son mucho más geniales que las demás. El segundo factor es el nivel de poder; cuanto más alto, mejor.
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
El brillo no es solo apariencia: en una batalla entre Blorkemon™️ con el mismo poder, uno brillante siempre se impondrá. A esto se le llama el Poder Brillante.
Implementa la función compareShinyPower, que codifica esta propiedad. El Order de dos cartas se determina por los niveles de poder si son diferentes, pero si son iguales, una carta brillante será mayor.
compareShinyPower newthree scientuna
--> GT
En una partida de cartas de Blorkemon™️ todo se vale, pero sigue existiendo 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 de compareShinyPower. La función debe devolver el nombre del monstruo del 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.