web-dev-qa-db-ja.com

Scalaには警備員がいますか?

私は数日前にscalaを学び始めました、そしてそれを学ぶとき、私はそれを他の 関数型プログラミング 言語( Haskell 、- Erlang )私はある程度精通していました。Scalaには guard シーケンスがありますか?

Scalaでパターンマッチングを行いましたが、otherwiseなどのガードに相当する概念はありますか?

45
Teja Kantamneni

はい、キーワード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の代わりに、ガードなしでパターンを指定するだけであることに注意してください。

19
sepp2k

簡単な答えはノーです。それはあなたが探しているものと正確には一致しません(Haskell構文と完全に一致します)。 Scalaの「match」ステートメントをガードと一緒に使用し、次のようなワイルドカードを指定します。

num match {
    case 0 => "Zero"
    case n if n > -1 =>"Positive number"
    case _ => "Negative number"
}
9
Shaun

複数の引数を持つ一致にガードを適用する方法を探しているこの投稿に出くわしましたが、実際には直感的ではないため、ここにランダムな例を追加します。

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))
4
cevaris