Does Scala have guards?

前端 未结 4 1377
旧时难觅i
旧时难觅i 2020-12-09 14:48

I started learning scala a few days ago and when learning it, I am comparing it with other functional programming languages like (Haskell, Erlang) which I had some familiari

相关标签:
4条回答
  • 2020-12-09 14:58

    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.

    0 讨论(0)
  • 2020-12-09 15:01

    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
    
    0 讨论(0)
  • 2020-12-09 15:03

    The simple answer is no. It is not exactly what you are looking for (an exact match for Haskell syntax). You would 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"
    }
    
    0 讨论(0)
  • 2020-12-09 15:17

    I stumbled to this post looking how to apply guards to matches with multiple arguments, it is not really intuitive, so I am adding an random example here.

    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))
    
    0 讨论(0)
提交回复
热议问题