遍历Scala中的任何一个

St.*_*rio 0 functional-programming scala either scala-cats

我写了以下简单的代码:

import cats.effect.IO
import cats.instances.either._
import cats.syntax.TraverseSyntax

object Test extends App with TraverseSyntax{
  val e: Either[String, IO[Int]] = Right(IO(2))
  e.sequence //error here
}
Run Code Online (Sandbox Code Playgroud)

不幸的是它拒绝编译

Error:(25, 94) value sequence is not a member of scala.util.Either
Run Code Online (Sandbox Code Playgroud)

你能解释一下原因吗?我导入了either包含的实例Traverse[Either[A, ?]].怎么了?

Luk*_*itz 5

除了Kolmar的答案(这是非常彻底的),我想提出一个替代的,更容易的解决方案.

自Scala 2.11.9以来,有一个编译器标志允许它识别具有多个类型参数的类型应该只具有一个类型的类型.我们称之为"部分统一".

启用部分统一的最简单方法是添加sbt-partial-unification 插件.

如果你使用的是Scala 2.11.9或更高版本,你也可以简单地添加编译器标志:

scalacOptions += "-Ypartial-unification"
Run Code Online (Sandbox Code Playgroud)

然后你的代码编译没有问题:

import cats.effect.IO
import cats.instances.either._
import cats.syntax.TraverseSyntax

object Test extends App with TraverseSyntax {
  val e: Either[String, IO[Int]] = Right(IO(2))
  e.sequence // No more error here
} 
Run Code Online (Sandbox Code Playgroud)