Cats Scala 中的序列和遍历来映射类型
Sequence and Traverse in Cats Scala to map a types
我有一个 List[EitherT[IO, String, Int]]
类型的值,我想对其进行排序以便将其映射到 EitherT[IO,String, List[Int]]
我阅读并找到了顺序方法
但是它给了我一个错误,说它需要 [G] 的隐式应用程序如何解决这个问题
如果没有 MCVE,很难猜出编译错误的原因(“需要一个隐含的 Applicative[G]
”)。请提供那个。
在 Cats 2.2.0 之前需要导入实例
https://meta.plasm.us/posts/2019/09/30/implicit-scope-and-cats/
https://github.com/typelevel/cats/releases/tag/v2.2.0
http://eed3si9n.com/herding-cats/import-guide.html
import cats.instances.either._ // or cats.instances.all._
import cats.instances.list._ // or cats.instances.all._
import cats.syntax.traverse._ // or cats.syntax.all._
// or cats.implicits._
从 Cats 2.2.0 开始,您仍然需要导入语法,但不再需要导入实例。
在 Scala 2.13.0 之前你必须添加到 build.sbt
scalacOptions += "-Ypartial-unification"
https://github.com/typelevel/cats/issues/2948
http://eed3si9n.com/herding-cats/partial-unification.html
https://www.reddit.com/r/scala/comments/7ak9c5/ypartialunification/
或者您可能需要指定泛型(未推断)
val l: List[Either[String, Int]] = ???
val l1: List[EitherT[IO, String, Int]] = ???
l.sequence[({ type G[X] = Either[String, X] })#G, Int] // using type lambda
l1.sequence[({ type G[X] = EitherT[IO, String, X] })#G, Int] // using type lambda
l.sequence[Either[String, *], Int] // using kind-projector
l1.sequence[EitherT[IO, String, *], Int] // using kind-projector
或者你可以展开-包裹EitherT
EitherT(
l1.traverse(_.value)
.map(
_.sequence[Either[String, *], Int]
)
)
如果你写一个泛型方法,也许添加一个上下文绑定就足够了
def foo[G[_]: Applicative] = {
// ^^^^^^^^^^^ here
// ... using .sequence ...
}
我有一个 List[EitherT[IO, String, Int]]
类型的值,我想对其进行排序以便将其映射到 EitherT[IO,String, List[Int]]
我阅读并找到了顺序方法 但是它给了我一个错误,说它需要 [G] 的隐式应用程序如何解决这个问题
如果没有 MCVE,很难猜出编译错误的原因(“需要一个隐含的 Applicative[G]
”)。请提供那个。
在 Cats 2.2.0 之前需要导入实例
https://meta.plasm.us/posts/2019/09/30/implicit-scope-and-cats/
https://github.com/typelevel/cats/releases/tag/v2.2.0
http://eed3si9n.com/herding-cats/import-guide.html
import cats.instances.either._ // or cats.instances.all._ import cats.instances.list._ // or cats.instances.all._ import cats.syntax.traverse._ // or cats.syntax.all._ // or cats.implicits._
从 Cats 2.2.0 开始,您仍然需要导入语法,但不再需要导入实例。
在 Scala 2.13.0 之前你必须添加到
build.sbt
scalacOptions += "-Ypartial-unification"
https://github.com/typelevel/cats/issues/2948
http://eed3si9n.com/herding-cats/partial-unification.html
https://www.reddit.com/r/scala/comments/7ak9c5/ypartialunification/
或者您可能需要指定泛型(未推断)
val l: List[Either[String, Int]] = ??? val l1: List[EitherT[IO, String, Int]] = ??? l.sequence[({ type G[X] = Either[String, X] })#G, Int] // using type lambda l1.sequence[({ type G[X] = EitherT[IO, String, X] })#G, Int] // using type lambda l.sequence[Either[String, *], Int] // using kind-projector l1.sequence[EitherT[IO, String, *], Int] // using kind-projector
或者你可以展开-包裹
EitherT
EitherT( l1.traverse(_.value) .map( _.sequence[Either[String, *], Int] ) )
如果你写一个泛型方法,也许添加一个上下文绑定就足够了
def foo[G[_]: Applicative] = { // ^^^^^^^^^^^ here // ... using .sequence ... }