Scala案例类和尾递归最佳实践

时间:2015-04-18 18:55:59

标签: scala recursion pattern-matching tail-recursion case-class

我对java中的scala相当新,对模式匹配也很新。我试图解决的一个问题是何时使用它以及它的成本/收益是什么。例如这个

def myThing(a: Int): Int = a match {
  case a: Int if a > 0 => a
  case _ => myThing(a + 1)
}

与此相同(除非我真的误解了某些事情)

def myThing(a: Int): Int = {
  if (a > 0) a
  else myThing(a + 1)
}

所以我的实际问题是: 但他们是否以同样的方式运行?我的模式匹配示例尾递归吗?如果没有,那么为什么不在第二个例子中呢?

还有其他我应该担心的事情,比如资源吗?或者我应该总是尝试使用模式匹配?

我已经四处寻找这些答案,但却找不到任何最佳做法"为此!

编辑:我知道所使用的示例有点做作 - 我刚刚添加它以清楚下面的问题 - 谢谢!

3 个答案:

答案 0 :(得分:6)

是的,他们确实运行相同。每种语法糖的最佳实践都是相同的:只要它提供更易读或更灵活的代码,就可以使用它。在if语句的示例中,您可以省略大括号并只写

def myThing(a: Int): Int =  if (a > 0) a else myThing(a + 1)

这绝对比模式匹配更方便。在以下情况下,模式匹配很方便:

同样to ensure you function is tail-recursive您可以使用@tailrec注释

答案 1 :(得分:2)

另一种“Scala”方法是为正数定义一个提取器

  def myThing(a: Int): Int = a match {
    case PositiveNum(positive) => positive
    case negative => myThing(negative + 1)
  }


  object PositiveNum {
    def unapply(n: Int): Option[Int] = if (n > 0) Some(n) else None
  }

答案 2 :(得分:1)

另一种模式匹配评估谓词(条件)的方法,

def myThing(a: Int): Int = a > 0 match {
  case true => a
  case _    => myThing(a + 1)
}

其中匹配包括没有(附加)警卫或类型声明。