I was reading Herding Cats
The final example on the Traverse page on sequencing List of Either failed for me.
in the example they do this:-
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)
But When I try I get the following error:-
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
^
But when I help out the compiler with a type alias to fix the Left type all is good:-
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))
So my question is how do I get the type inference to do the right thing to make the example work without having to introduce the type alias?
Have I missed a crucial implicit import to work with Either[A,B] ?
Thanks Karl
Your code lacks scalac option -Ypartial-unification
.
In build.sbt you should add
scalaVersion := "2.12.6"
libraryDependencies += "org.typelevel" %% "cats-core" % "1.1.0"
scalacOptions += "-Ypartial-unification"
or start Scala console with command
scala -Ypartial-unification
来源:https://stackoverflow.com/questions/50499152/how-to-sequence-either-with-scala-cats-without-a-type-alias-see-herding-cats