Cats Scala中的序列和遍历以映射类型
Posted
技术标签:
【中文标题】Cats Scala中的序列和遍历以映射类型【英文标题】:Sequence and Traverse in Cats Scala to map a types 【发布时间】:2021-12-01 22:13:25 【问题描述】:我有一个List[EitherT[IO, String, Int]]
类型的值,我想对其进行排序以便将其映射到EitherT[IO,String, List[Int]]
我阅读并找到了序列方法 但它给了我一个错误,说它需要 [G] 的隐式应用程序如何解决这个问题
【问题讨论】:
ialmostwouldhavedownvotedbecau.se/nomcve/. 【参考方案1】:如果没有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
Why is import cats.implicits._ no longer necessary for importing type class instances?
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
value YpartialUnification is not a member of scala.tools.nsc.Settings
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 ...
【讨论】:
以上是关于Cats Scala中的序列和遍历以映射类型的主要内容,如果未能解决你的问题,请参考以下文章