Scala:如何将此if-then-else梯形图转换为模式匹配

时间:2016-05-12 09:55:57

标签: scala functional-programming pattern-matching

我有以下代码,它使用if-then-else梯形图:

val test: Array[Array[Int]] = ...
val dim = 3 
if (dim < test.length - 1) {
    1   
} else {
    0
}

将其作为模式匹配进行投射我尝试:

val dim = 3 
val maxDim = test.length - 1
dim match {
   case _ < maxDim => {
       1        
   }
   case _ => {
       0        
   }
}

但这会产生多个错误......我怎样才能将其作为模式匹配?

更新:另一次尝试将是

dim match {
    case maxDim => 0
    case _ => 1
}

但不起作用

2 个答案:

答案 0 :(得分:4)

test.lift(dim).fold(0){ _ => 1}

这不是模式匹配,但重点是在这种情况下你不需要模式匹配。

解释:你的if-then thingy基本上测试索引是否对数组有效,如果是,则返回1,如果不是则返回0(我假设,缺乏对负值的测试是疏忽,而不是故意的特征)。

scala中的集合是PartialFunctionsInt到元素类型,它们在对集合有效的索引域上定义,并返回该索引处元素的值。

PartialFunction.lift是一个实用程序,它允许您测试是否定义了部分函数,​​如果它是一次性的话,则应用它。如果它在参数值中定义,它将返回结果的Option,否则,您将获得None

因此,test.lift(dim)如果None无效则返回dim,否则返回Some数组。然后我们.fold选项:.fold返回第一个参数是选项为空,如果不是则执行该函数。

全部放在一起:我们得到Option表示索引是否有效,然后.fold如果它为空则返回0,否则返回1。

答案 1 :(得分:2)

如果需要测试布尔表达式,则在匹配大小写中需要if子句。试试这个:

dim match {
  case i if i < maxDim => 1
  case _ => 0
}