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中的序列和遍历以映射类型的主要内容,如果未能解决你的问题,请参考以下文章

Scala从入门到精通之四-映射和元组

Scala:Map.flatten 的用例?

scala的多种集合的使用之遍历集合的方法

2021年大数据常用语言Scala(二十一):函数式编程 遍历 foreach

Scala基础语法学习

Scala基础语法学习