斯卡拉有警卫吗?
我几天前开始学习Scala,在学习Scala时,我将其与其他函数式编程语言(如Haskell , Erlang )进行了比较,后者对此我有一定的了解。 斯卡拉有可用的守卫序列吗?
我在Scala中进行了模式匹配,但是有没有其他概念等同于另外的守卫呢?
是的,它使用关键字if
。 从底部附近的斯卡拉游览的案例类部分:
def isIdentityFun(term: Term): Boolean = term match { case Fun(x, Var(y)) if x == y => true case _ => false }
(这在“ 模式匹配”页面中没有提及,也许是因为Tour是如此快速的概述。)
在Haskell中, otherwise
实际上只是一个绑定到True
的variables。 所以它不会为模式匹配的概念添加任何力量。 你可以通过重复你的初始模式没有警惕得到它:
// 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
,您只需指定模式没有警卫。
简单回答是不。 这不正是你正在寻找(一个完全匹配的Haskell语法)。 您可以使用Scala的“匹配”语句与警卫,并提供一个通配符,如:
num match { case 0 => "Zero" case n if n > -1 =>"Positive number" case _ => "Negative number" }
我偶然发现了这个post,看看如何将警卫应用于多个参数的匹配,这不是很直观,所以我在这里添加一个随机的例子。
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))