Имеет ли Scala охранники?
Я начал изучать scala несколько дней назад, и, изучая его, я сравниваю его с другими функциональным программированием, такими как (Haskell, Erlang), с которым я знакомство с, Имеет ли scala guard последовательности
Я прошел через сопоставление с образцом в Scala, но существует ли какое-либо понятие, эквивалентное охранникам с помощью otherwise
и всех?
Ответы
Ответ 1
Да, он использует ключевое слово if
. Из раздела Case Classes в разделе Tour of Scala, внизу:
def isIdentityFun(term: Term): Boolean = term match {
case Fun(x, Var(y)) if x == y => true
case _ => false
}
(Это не упоминается на странице Pattern Matching, возможно потому, что Tour - это быстрый обзор.)
В 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
Ответ 2
Да, есть ограждения с образцами. Они используются следующим образом:
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 вы просто указываете шаблон без защитника.
Ответ 3
Простой ответ - нет. Это не совсем то, что вы ищете (точное соответствие синтаксису Haskell). Вы использовали бы инструкцию Scala "match" с охранником и поставляли бы дикую карту, например:
num match {
case 0 => "Zero"
case n if n > -1 =>"Positive number"
case _ => "Negative number"
}
Ответ 4
Я наткнулся на это сообщение и посмотрел, как применять стражи к совпадениям с несколькими аргументами, на самом деле это не интуитивно, поэтому я добавляю случайный пример здесь.
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))