É possível comparar em uma comparação usando o sistema de correspondência de padrões no Scala? Por exemplo:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
A segunda declaração de caso é ilegal, mas eu gostaria de poder especificar "quando a for maior que".
scala
pattern-matching
Teorema de Befitting
fonte
fonte
case x if x.size > 2 => ...
Respostas:
Você pode adicionar uma proteção, ou seja, uma
if
expressão booleana e após o padrão:Edit: Observe que isso é mais do que superficialmente diferente de colocar um
if
após o=>
, porque um padrão não será compatível se a guarda não for verdadeira.fonte
Como uma não resposta ao espírito da pergunta, que perguntou como incorporar predicados em uma cláusula de correspondência, nesse caso, o predicado pode ser fatorado antes de
match
:Agora, a documentação para
scala.math.Ordering.compare(T, T)
promete apenas que os resultados não iguais serão maiores ou menores que zero . O JavaComparable#compareTo(T)
é especificado da mesma forma que o Scala. Por acaso, é convencional usar 1 e -1 para os valores positivo e negativo, respectivamente, como a implementação atual do Scala , mas não se pode fazer essa suposição sem algum risco de a implementação mudar por baixo.fonte
compare()
ecompareTo()
não especificar 0, 1 e -1 como seu codomain.Uma solução que, na minha opinião, é muito mais legível do que adicionar guardas:
Notas:
Ordered.compare
retorna um número inteiro negativo se for menor que isso, positivo se for maior e0
se for igual.Int.signum
comprime a saída decompare
para-1
para um número negativo (menor que 10),1
positivo (maior que 10) ou0
zero (igual a 10).fonte
Embora todas as respostas acima e abaixo respondam perfeitamente à pergunta original, algumas informações adicionais podem ser encontradas na documentação https://docs.scala-lang.org/tour/pattern-matching.html , mas não se encaixam no meu caso mas como essa resposta do stackoverflow é a primeira sugestão no Google, eu gostaria de postar minha resposta, que é o caso principal da pergunta acima.
Minha pergunta é:
Que pode ser parafraseado:
A resposta é o exemplo de código abaixo:
link para o scala fiddle: https://scalafiddle.io/sf/G37THif/2, como você pode ver, a
case xs if n <= 0 => xs
instrução é capaz de usar n (argumento de uma função) com a instrução guard (if).Espero que isso ajude alguém como eu.
fonte