scala要么模式匹配

时间:2010-12-13 19:35:52

标签: scala pattern-matching scala-2.8

这段代码有什么问题?

(Left("aoeu")) match{case Right(x) => ; case Left(x) => }
<console>:6: error: constructor cannot be instantiated to expected type;
 found   : Right[A,B]
 required: Left[java.lang.String,Nothing]     

为什么模式匹配器没有跳过Right并检查Left?

2 个答案:

答案 0 :(得分:12)

隐式输入推断Left("aoeu")Left[String,Nothing]。您需要明确键入它。

(Left("aoeu"): Either[String,String]) match{case Right(x) => ; case Left(x) => }

似乎模式匹配候选者必须始终是匹配匹配值的类型。

scala> case class X(a: String) 
defined class X

scala> case class Y(a: String) 
defined class Y

scala> X("hi") match {  
     | case Y("hi") => ;
     | case X("hi") => ;
     | }
<console>:11: error: constructor cannot be instantiated to expected type;
 found   : Y
 required: X
       case Y("hi") => ;
            ^

为什么它会像这样?我怀疑没有充分的理由尝试匹配不兼容的类型。试图这样做表明开发人员没有写出他们真正想要的东西。编译器错误有助于防止错误。

答案 1 :(得分:4)

scala> val left: Either[String, String] = Left("foo")
left: Either[String,String] = Left(foo)

scala> left match {
     | case Right(x) => "right " + x
     | case Left(x) => "left " + x }
res3: java.lang.String = left foo