斯卡拉有警卫吗?

我几天前开始学习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))