代码之家  ›  专栏  ›  技术社区  ›  Karl

如何使用不带类型别名的scala cats排序(请参见“赶猫”)。

  •  2
  • Karl  · 技术社区  · 6 年前

    我在读书 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
       ^
    

    但当我用类型别名帮助编译器修复左边的类型时,一切都很好:

    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]一起工作的一个关键的隐含导入?

    谢谢 卡尔

    1 回复  |  直到 6 年前
        1
  •  5
  •   Dmytro Mitin    6 年前

    您的代码缺少scalac选项 -Ypartial-unification .

    在build.sbt中,您应该添加

    scalaVersion := "2.12.6"
    
    libraryDependencies += "org.typelevel" %% "cats-core" % "1.1.0"
    
    scalacOptions += "-Ypartial-unification"
    

    或者用命令启动scala控制台

    scala -Ypartial-unification
    

    http://eed3si9n.com/herding-cats/partial-unification.html