首页 > 解决方案 > 在 Scala 中遍历

问题描述

我写了以下简单的代码:

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
}

不幸的是,它拒绝与

Error:(25, 94) value sequence is not a member of scala.util.Either

你能解释一下为什么吗?我导入either了包括Traverse[Either[A, ?]]. 怎么了?

标签: scalafunctional-programmingscala-catseither

解决方案


除了 Kolmar 的回答(非常彻底)之外,我还想提出一个替代且更简单的解决方案。

自 Scala 2.11.9 以来就有一个编译器标志,它允许它识别具有多个类型参数的类型何时应该表现得像只有一个类型参数的类型。我们称之为“部分统一”。

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

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

scalacOptions += "-Ypartial-unification"

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

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
} 

在最近发布的 Scala 2.13 中,它现在默认开启,所以它应该可以开箱即用。


推荐阅读