Scalaのパターンマッチングシステムを使用して比較を照合することはできますか?例えば:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
2番目のケースステートメントは違法ですが、「aがいつより大きいか」を指定できるようにしたいと思います。
Scalaのパターンマッチングシステムを使用して比較を照合することはできますか?例えば:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
2番目のケースステートメントは違法ですが、「aがいつより大きいか」を指定できるようにしたいと思います。
回答:
述語をmatch句に組み込む方法を尋ねた質問の精神に対する非回答として、この場合、述語はの前に除外できますmatch
。
def assess(n: Int) {
println(
n compare 10 match {
case 0 => "ten"
case 1 => "greater than ten"
case -1 => "less than ten"
})
}
ここで、のドキュメントでscala.math.Ordering.compare(T, T)
は、等しくない結果がゼロより大きいか、ゼロ未満になることのみを約束しています。Java Comparable#compareTo(T)
はScalaと同様に指定されます。Scalaの現在の実装のように、正の値と負の値にそれぞれ1と-1を使用するのは慣習的なことですが、実装が下から変更されるリスクがないと、このような仮定を行うことはできません。
compare()
とcompareTo()
0、1、および-1彼らの終域として指定しないでください。
私の意見では、ガードを追加するよりもはるかに読みやすいソリューションです。
(n compare 10).signum match {
case -1 => "less than ten"
case 0 => "ten"
case 1 => "greater than ten"
}
ノート:
Ordered.compare
これがそれより小さい場合は負の整数を返し、それより大きい場合、および0
等しい場合は正の整数を返します
。Int.signum
以下からの出力を圧縮compare
する-1
負の数(10未満)のために、1
正の(10を超える)のために、または0
ゼロのためには、(10に等しいです)。上記のすべてと以下の答えは元の質問に完全に回答しますが、いくつかの追加情報はドキュメントhttps://docs.scala-lang.org/tour/pattern-matching.htmlで見つけることができますが、それらは私のケースに適合しませんでしたしかし、このstackoverflow回答はGoogleでの最初の提案であるため、上記の質問のコーナーケースである私の回答を投稿したいと思います。
私の質問は:
これは言い換えることができます:
答えは以下のコード例です:
def drop[A](l: List[A], n: Int): List[A] = l match {
case Nil => sys.error("drop on empty list")
case xs if n <= 0 => xs
case _ :: xs => drop(xs, n-1)
}
Scalaのフィドルへのリンク:https://scalafiddle.io/sf/G37THif/2
あなたが見ることができるようにcase xs if n <= 0 => xs
ステートメントでは、guard(if)ステートメントでn(関数の引数)を使用できること。
これが私のような人に役立つことを願っています。
case x if x.size > 2 => ...