У Скалы есть охранники? - PullRequest
44 голосов
/ 15 февраля 2010

Я начал изучать scala несколько дней назад, и, изучая его, я сравниваю его с другими функциональными программами такими языками ( Haskell , Erlang ) Я имел некоторое знакомство с. Имеется ли в Scala guard последовательностей?

Я прошел через сопоставление с образцом в Scala, но есть ли какое-нибудь понятие, эквивалентное охранникам с otherwise и всеми?

Ответы [ 4 ]

54 голосов
/ 15 февраля 2010

Да, используется ключевое слово if. Из раздела Case Classes A Tour of Scala, возле дна:

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

(Это не упомянуто на странице Pattern Matching , возможно, из-за краткого обзора тура.)


В 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
19 голосов
/ 15 февраля 2010

Да, есть охранники. Они используются так:

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

Обратите внимание, что вместо otherwise -пункта вы просто указываете шаблон без охраны.

9 голосов
/ 15 февраля 2010

Простой ответ - нет. Это не совсем то, что вы ищете (точное соответствие синтаксису Haskell). Вы могли бы использовать выражение «совпадение» в Scala с охранником и указывать подстановочный знак, например:

num match {
    case 0 => "Zero"
    case n if n > -1 =>"Positive number"
    case _ => "Negative number"
}
4 голосов
/ 23 апреля 2014

Я наткнулся на этот пост, глядя на то, как применять охранники для совпадений с несколькими аргументами, это не совсем интуитивно, поэтому я добавляю случайный пример здесь.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...