views:

308

answers:

3

Hi I started learning scala a few days back and when learning it, I am comparing it with other FP languages like (Haskell, Erlang) which I had some familiarity with. My Question is Does Scala has Guard sequences available, I went through pattern matching in Scala but is there any concept equivalent to Guards with otherwise and all?

+12  A: 

Yes, it uses the keyword if. From the Case Classes section of A Tour of Scala, near the bottom:

def isIdentityFun(term: Term): Boolean = term match {
  case Fun(x, Var(y)) if x == y => true
  case _ => false
}

(This isn't mentioned on the Pattern Matching page, maybe because the Tour is such a quick overview.)


In Haskell, otherwise is actually just a variable bound to True. So it doesn't add any power to the concept of pattern matching. You can get it just by repeating your initial pattern without the guard:

// 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
Nathan Sanders
+5  A: 

Yes, there are pattern guards. They're used like this:

def boundedInt(min:Int, max: Int): Int => Int = {
  case n if n>max => max
  case n if n<min => min
  case n => n
}

Note that instead of an otherwise-clause, you simply specifiy the pattern without a guard.

sepp2k
+3  A: 

Simple answer is no. Not exactly like what you are looking for (an exact match for Haskell syntax). What you'd do is use Scala's "match" statement with a guard, and supply a wild card like:

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