私は数日前にscalaを学び始めました、そしてそれを学ぶとき、私はそれを他の 関数型プログラミング 言語( Haskell 、- Erlang )私はある程度精通していました。Scalaには guard シーケンスがありますか?
Scalaでパターンマッチングを行いましたが、otherwise
などのガードに相当する概念はありますか?
はい、キーワードif
を使用しています。 A Tour of Scalaの ケースクラス セクションから、下部近く:
def isIdentityFun(term: Term): Boolean = term match {
case Fun(x, Var(y)) if x == y => true
case _ => false
}
(これは パターンマッチング ページには記載されていません。おそらくツアーが非常に簡単な概要であるためです。)
Haskellでは、otherwise
は実際にはTrue
にバインドされた単なる変数です。したがって、パターンマッチングの概念に力を加えることはありません。ガードなしで最初のパターンを繰り返すだけでそれを得ることができます:
// if this is your guarded match
case Fun(x, Var(y)) if x == y => true
// and this is your 'otherwise' match
case Fun(x, Var(y)) if true => false
// you could just write this:
case Fun(x, Var(y)) => false
はい、パターンガードがあります。それらは次のように使用されます:
def boundedInt(min:Int, max: Int): Int => Int = {
case n if n>max => max
case n if n<min => min
case n => n
}
otherwise
-clauseの代わりに、ガードなしでパターンを指定するだけであることに注意してください。
簡単な答えはノーです。それはあなたが探しているものと正確には一致しません(Haskell構文と完全に一致します)。 Scalaの「match」ステートメントをガードと一緒に使用し、次のようなワイルドカードを指定します。
num match {
case 0 => "Zero"
case n if n > -1 =>"Positive number"
case _ => "Negative number"
}
複数の引数を持つ一致にガードを適用する方法を探しているこの投稿に出くわしましたが、実際には直感的ではないため、ここにランダムな例を追加します。
def func(x: Int, y: Int): String = (x, y) match {
case (_, 0) | (0, _) => "Zero"
case (x, _) if x > -1 => "Positive number"
case (_, y) if y < 0 => "Negative number"
case (_, _) => "Could not classify"
}
println(func(10,-1))
println(func(-10,1))
println(func(-10,0))