cou*_*ech 8 scala pattern-matching scala-2.8
这段代码有什么问题?
(Left("aoeu")) match{case Right(x) => ; case Left(x) => }Run Code Online (Sandbox Code Playgroud)
<console>:6: error: constructor cannot be instantiated to expected type;
found : Right[A,B]
required: Left[java.lang.String,Nothing]
Run Code Online (Sandbox Code Playgroud)
为什么模式匹配器没有跳过右边并检查左?
Syn*_*sso 12
隐式打字推断Left("aoeu")是一个Left[String,Nothing].您需要明确键入它.
(Left("aoeu"): Either[String,String]) match{case Right(x) => ; case Left(x) => }
Run Code Online (Sandbox Code Playgroud)
似乎模式匹配候选者必须总是与匹配的值匹配的类型.
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") => ;
^
Run Code Online (Sandbox Code Playgroud)
为什么它会像这样?我怀疑没有充分的理由尝试匹配不兼容的类型.试图这样做表明开发人员没有写出他们真正想要的东西.编译器错误有助于防止错误.
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
Run Code Online (Sandbox Code Playgroud)