模式匹配BigInts

时间:2014-02-05 13:11:13

标签: scala

此因子实现适用于特定大小的数字:

def factorial(n:Int):Int = n match {
    case 0 => 1
    case x => x * factorial(x - 1)
}

我尝试使用BigInt使其适用于任何大小的数字

val zero = BigInt(0)
def factorial(n:BigInt):BigInt = n match {
    case zero => 1
    case x => x * factorial(x - 1)
}

每次对 factorial 的调用都会返回1,无论n的值如何。我认为这是因为第一种情况总是匹配,并且通过将其更改为

证明了这一点
case zero => 22

并验证每次输入都返回了22。

所以我的两个问题是

  1. 为什么第一个案例总是匹配?
  2. 有没有办法让这个函数的BigInt版本能够工作,同时坚持模式匹配?

2 个答案:

答案 0 :(得分:5)

您应该将zero重命名为Zero,或者像这样使用它:

case `zero` => 1

答案 1 :(得分:3)

要匹配变量,请用“`”

包装它
val zero = BigInt(0)
def factorial(n:BigInt):BigInt = n match {
    case `zero` => 1
    case x => x * factorial(x - 1)
}