2012-11-11 193 views
5
scala> (1,5) == BigInt(12) /% 7 
res3: Boolean = true 

scala> BigInt(12) /% 7 match { 
| case (1,5) => true 
| } 

<console>:9: error: type mismatch; 
found : Int(1) 
required: scala.math.BigInt 
      case (1,5) => true 
       ^

有人可能会解释我如何模式匹配在这里?斯卡拉模式匹配

回答

10

match比平等更具体;你不能只是平等的,你也必须具有相同的类型。

在这种情况下,BigInt不是案例类别,并且在其伴侣对象中没有unapply方法,因此您无法直接在该对象上进行匹配。你能做的最好的是其(例如case ab if (ab == (1,5)) =>

BigInt(12) /% 7 match { 
    case (a: BigInt,b: BigInt) if (a==1 && b==5) => true 
    case _ => false 
    } 

或其变型。

或者,可以用适当的类型的取消应用方法创建一个对象:

object IntBig { def unapply(b: BigInt) = Option(b.toInt) } 

scala> BigInt(12) /% 7 match { case (IntBig(1), IntBig(5)) => true; case _ => false } 
res1: Boolean = true 
+0

绑定到变量和警卫是我做的。我只是觉得它可能会做得更好一点。谢谢。 – marcus

1

的问题是,1/%返回5BigInt S和SO不匹配字面Intš即使equals法(==调用)返回true。这工作,但有点不雅:

scala> BigInt(12) /% 7 match { case (x, y) if x == 1 && y == 5 => true } 
res3: Boolean = true 
2

15Int类型。模式匹配期望scala.math.BigInt。所以,通过宣布一个和五个vals。

scala> val OneBig = BigInt(1) 
oneBig: scala.math.BigInt = 1 

scala> val FiveBig = BigInt(5) 
fiveBig: scala.math.BigInt = 5 

scala> BigInt(12) /% 7 match { 
    | case (OneBig, FiveBig) => true 
    | } 
res0: Boolean = true 
+3

这不行!模式中的“oneBig”和“fiveBig”是与之前定义的变量无关的新变量。这可以通过用大写字母('OneBig'和'FiveBig')命名或通过反引号将名称包围来改变。 –

+0

谢谢。忘了那个。对于那些有兴趣的人,请参阅楼梯书的http://stackoverflow.com/questions/4479474/scala-pattern-matching-with-lowercase-variable-name或page 317。 – Brian