Os tipos de Elm podem ser verificados quanto a "serem iguais" com o operador de igualdade (==).
O operador de desigualdade é (/=) (não !=, como em muitas linguagens).
O operador de igualdade funciona com literais, tuplos, registos e 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
Repara que nunca deves comparar funções, pois isso faz com que o programa rebente em tempo de execução.
Os operadores de comparação (<), (<=), (>), (>=) e as funções min, max e compare funcionam com tipos comparable.
O tipo comparable é um tipo especial que agrupa todos os tipos incorporados que podem ser comparados: números, carateres, strings, listas de elementos comparáveis e tuplos de elementos comparáveis.
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")
Os valores de outros tipos, como registos ou tipos personalizados, não podem ser comparados diretamente.
Alguns tipos incorporados exigem que o seu conteúdo seja comparable, como as chaves de Set ou Dict, uma vez que a sua estrutura depende de uma ordenação interna.
As listas de valores comparable podem ser ordenadas com List.sort e as listas de valores que podem ser mapeados para valores comparáveis podem ser ordenadas com List.sortBy.
Se precisares de uma ordenação hierárquica (ordenar por uma propriedade e desempatar com outra), também podes usar tuplos ou listas com List.sortBy, uma vez que os tuplos e as listas são ordenados por ordem lexicográfica.
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 função compare recebe dois valores comparable e devolve um Order.
Um Order é um tipo que verifica, numa única operação, se um valor é maior (GT), igual (EQ) ou menor (LT) do que outro.
compare 1 2
--> LT
compare "" ""
--> EQ
compare [12] []
--> GT
É possível construir funções de comparação para tipos arbitrários e usá-las, por exemplo, para ordenar com 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, sentes uma onda de nostalgia e uma vontade enorme de tirar o pó às tuas velhas cartas Blorkemon™️.
As cartas Blorkemon™️ são um excelente jogo de troca de cartas à moda antiga.
Cada Card tem um monstro Blorkemon™️ desenhado, juntamente com um nível de poder de ataque e, se tiveres sorte, a carta pode até ser brilhante.
Cada carta Blorkemon™️ parece mais poderosa do que a seguinte, mas é melhor verificares.
Implementa a função isMorePowerful. Deve devolver True se a carta no seu primeiro argumento for estritamente mais poderosa do que a outra, e False caso contrário.
newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True
isMorePowerful newthree scientuna
--> True
Com uma mão cheia de cartas Blorkemon™️, deves ser capaz de preparar o ataque mais devastador.
Implementa a função maxPower, que devolve o nível de poder mais alto de duas cartas.
maxPower newthree scientuna
--> 120
Parece que te lembras de ter pelo menos uma carta de cada Blorkemon™️, mas já passou algum tempo desde a última vez que verificaste. Deves ordenar as tuas cartas para as comparares com a listagem oficial na Pulpapedia.
Implementa a função sortByMonsterName, que deve receber uma lista de Cards e devolver uma lista ordenada pelos nomes dos monstros.
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
Os Blorkemon™️ são a coisa mais fixe de sempre. Não estás a usar esse termo de ânimo leve, tens um método científico para o demonstrar.
Implementa a função sortByCoolness, que ordena uma lista de cartas colocando as mais fixes primeiro.
O quão fixe é uma carta determina-se primeiro pelo seu brilho: todas as cartas brilhantes são muito mais fixes do que as outras.
O segundo fator é o nível de poder: quanto mais alto, melhor.
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
O brilho não é só para exibir. Numa batalha entre Blorkemon™️ com o mesmo poder, o brilhante prevalece sempre. A isto chama-se Shiny Power.
Implementa a função compareShinyPower, que codifica esta propriedade.
A Order de duas cartas é determinada pelos níveis de poder se forem diferentes, mas se forem iguais, uma carta brilhante é maior.
compareShinyPower newthree scientuna
--> GT
Num jogo de cartas Blorkemon™️, tudo pode acontecer, mas há ainda uma tendência para as cartas mais poderosas ganharem.
Implementa a função expectedWinner, que devolve o nome do monstro com mais probabilidades de ganhar, segundo a ordenação de compareShinyPower.
A função deve devolver o nome do monstro do vencedor esperado, ou "too close to call" se ambos os oponentes tiverem o mesmo Shiny Power.
expectedWinner newthree scientuna
--> "Newthree"
Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.