我正在阅读Herding Cats
关于排序列表中Traverse page的最后一个例子,对我来说都失败了。
在示例中他们这样做: -
scala> List(Right(1): Either[String, Int]).sequence
res5: Either[String,List[Int]] = Right(List(1))
scala> List(Right(1): Either[String, Int], Left("boom"): Either[String, Int]).sequence
res6: Either[String,List[Int]] = Left(boom)
但是当我尝试时,我收到以下错误: -
scala> import cats._, cats.data._, cats.implicits._
scala> val les = List(Right(3):Either[String,Int], Right(2):Either[String,Int])
scala> les.sequence
<console>:37: error: Cannot prove that Either[String,Int] <:< G[A].
les.sequence
^
但是当我用类型别名帮助编译器修复Left类型时,一切都很好: -
scala> type XorStr[X] = Either[String,X]
defined type alias XorStr
scala> val les = List(Right(3):XorStr[Int], Right(2):XorStr[Int])
les: List[XorStr[Int]] = List(Right(3), Right(2))
scala> les.sequence
res0: XorStr[List[Int]] = Right(List(3, 2))
所以我的问题是如何让类型推断做正确的事情以使示例工作而不必引入类型别名?
我是否错过了一个关键的隐式导入来使用[A,B]?
由于 卡尔
答案 0 :(得分:5)
您的代码缺少scalac选项-Ypartial-unification
。
在build.sbt中你应该添加
scalaVersion := "2.12.6"
libraryDependencies += "org.typelevel" %% "cats-core" % "1.1.0"
scalacOptions += "-Ypartial-unification"
或使用命令
启动Scala控制台scala -Ypartial-unification