使用 flatMap 进行类型解析

用户1698641

为什么我需要在第一行添加类型注释?c.get[List[String]]("primary-group")Decoder.Result[List[String]]flatMap它应该保留顶级类型之后,Decoder.Result[String]但是它更改为Either[DecodingFailure, String]。为什么?是它的问题dependent type吗?

  case class JWTPayload(primaryGroup: Group, groupMember: List[Group], name: String, pid: String)

  implicit val jwtPayloadDecoder: Decoder[JWTPayload] = Decoder.instance(c =>
    (
      c.get[List[String]]("primary-group").flatMap(l => if(l.size == 1) l.head.asRight else DecodingFailure("", c.history).asLeft) : Decoder.Result[String],
      c.get[List[String]]("group-member"),
      c.get[String]("name"),
      c.get[String]("pid")
    ).map4(
     JWTPayload
    )
  )

没有: Decoder.Result[String我得到

Error:(43, 7) value map4 is not a member of (scala.util.Either[io.circe.DecodingFailure,String], io.circe.Decoder.Result[List[String]], io.circe.Decoder.Result[String], io.circe.Decoder.Result[String])
possible cause: maybe a semicolon is missing before `value map4'?
    ).map4(

谢谢

塞尔格

这不是一个完整的答案,但我希望它能提供一些见解。这里的关键部分是如何map4实施。从cats 0.9开始,它是通过cats.syntax.TupleCartesianSyntaxtrait和它的隐式完成的catsSyntaxTuple4Cartesian,它将一个4元组包装成一个cats.syntax.Tuple4CartesianOps类(在cats 1.0中,“笛卡尔”被改为“半群”)。此代码由Boilerplate.scala为最多 22 的所有元组自动生成自动生成的代码如下所示:

implicit def catsSyntaxTuple4Cartesian[F[_], A0, A1, A2, A3](t4: Tuple4[F[A0], F[A1], F[A2], F[A3]]): Tuple4CartesianOps[F, A0, A1, A2, A3] = new Tuple4CartesianOps(t4)


private[syntax] final class Tuple4CartesianOps[F[_], A0, A1, A2, A3](t4: Tuple4[F[A0], F[A1], F[A2], F[A3]]) {
  def map4[Z](f: (A0, A1, A2, A3) => Z)(implicit functor: Functor[F], cartesian: Cartesian[F]): F[Z] = Cartesian.map4(t4._1, t4._2, t4._3, t4._4)(f)
  def contramap4[Z](f: Z => (A0, A1, A2, A3))(implicit contravariant: Contravariant[F], cartesian: Cartesian[F]): F[Z] = Cartesian.contramap4(t4._1, t4._2, t4._3, t4._4)(f)
  def imap4[Z](f: (A0, A1, A2, A3) => Z)(g: Z => (A0, A1, A2, A3))(implicit invariant: Invariant[F], cartesian: Cartesian[F]): F[Z] = Cartesian.imap4(t4._1, t4._2, t4._3, t4._4)(f)(g)
  def apWith[Z](f: F[(A0, A1, A2, A3) => Z])(implicit apply: Apply[F]): F[Z] = apply.ap4(f)(t4._1, t4._2, t4._3, t4._4)
}

注意F[_](函子)类型参数。这段代码有效地将map4方法添加到任何 4 元组,其中每个内部类型在某些类型上都是相同的函子。

所以假设你做了import cats.implicits._,在(部分)隐式解析之后,你的代码实际上是这样的:

cats.implicits.catsSyntaxTuple4Cartesian[Decoder.Result, String, List[String], String, String](
  c.get[List[String]]("primary-group").flatMap(l => if (l.size == 1) l.head.asRight else DecodingFailure("", c.history).asLeft): Decoder.Result[String],
  c.get[List[String]]("group-member"),
  c.get[String]("name"),
  c.get[String]("pid")
).map4[JWTPayload](
  JWTPayload
)

如果不指定Decoder.Result[String],Scala编译器是不够聪明得到它应该分裂Either[DecodingFailure, String]成仿函数类型Either[DecodingFailure, _]String

  1. 将有匹配FunctorCartesian隐式对象(实际上由cats.implicits对象通过cats.instances.AllInstancescats.instances.EitherInstances特征提供)

  2. 它将匹配用于元组中其他 3 个字段的函子类型(即Decoder.Result[_])。

所以我认为这种行为是map4通过隐式 Ops 类添加到 4 元组的事实和基础类型Either是 2 位泛型类型而不是简单的Functor.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 flatmap 进行搜索功能

来自分类Dev

如何使用左方差注释对flatMap vavr进行注释

来自分类Dev

使用flatMap串联列表

来自分类Dev

奇怪的flatMap返回类型

来自分类Dev

使用flatMap枚举SpriteKit节点

来自分类Dev

使用带有Sets和类型界限的flatMap编译错误

来自分类Dev

如何使用FlatMap Java8根据值的键数对哈希图进行排序?

来自分类Dev

PRISM resolve与使用类型进行解析的工厂的接口

来自分类Dev

较高种类类型的flatMap返回类型被解析为基础Iterable,而不是较高种类类型本身

来自分类Dev

不使用flatMap打印列表项

来自分类Dev

如何使用flatMap()在反应堆语境?

来自分类Dev

在flatMap之后,如何记住使用它的价值?

来自分类Dev

RxSwift:使用flatMap需要帮助并减少

来自分类Dev

使用flatMap移除集合中的尝试失败

来自分类Dev

如何在 flatMap 中使用 await 方法?

来自分类Dev

在 Rx 中使用 FlatMap 的正确方法?

来自分类Dev

在带有 flatmap 的 Scala 中使用 RxJava

来自分类Dev

Swift-使用map / reduce / flatmap将数组字典还原为相同类型的单个数组

来自分类Dev

Spark map和flatMap结果类型

来自分类Dev

在rxJs中与flatMap vs concatMap进行斗争

来自分类Dev

无法解析 Option 类型的 Scala flatMap 方法。这样做的正确方法是什么?

来自分类Dev

神秘的flatMap:无法flatMap使用新Array(1)创建的内部数组

来自分类Dev

神秘的flatMap:无法flatMap使用新Array(1)创建的内部数组

来自分类Dev

Java 8 FlatMap-以嵌套形式添加项目并使用FlatMap检索对象

来自分类Dev

使用默认值在Scala中进行一般类型解析

来自分类Dev

使用IntStream的flatMap方法打印2D数组

来自分类常见问题

为什么我们需要使用flatMap?

来自分类Dev

Scala:如何使用flatMap和Options计算Seq [Double]的方差?

来自分类Dev

RxJava-当返回可能为null时使用flatmap

Related 相关文章

  1. 1

    使用 flatmap 进行搜索功能

  2. 2

    如何使用左方差注释对flatMap vavr进行注释

  3. 3

    使用flatMap串联列表

  4. 4

    奇怪的flatMap返回类型

  5. 5

    使用flatMap枚举SpriteKit节点

  6. 6

    使用带有Sets和类型界限的flatMap编译错误

  7. 7

    如何使用FlatMap Java8根据值的键数对哈希图进行排序?

  8. 8

    PRISM resolve与使用类型进行解析的工厂的接口

  9. 9

    较高种类类型的flatMap返回类型被解析为基础Iterable,而不是较高种类类型本身

  10. 10

    不使用flatMap打印列表项

  11. 11

    如何使用flatMap()在反应堆语境?

  12. 12

    在flatMap之后,如何记住使用它的价值?

  13. 13

    RxSwift:使用flatMap需要帮助并减少

  14. 14

    使用flatMap移除集合中的尝试失败

  15. 15

    如何在 flatMap 中使用 await 方法?

  16. 16

    在 Rx 中使用 FlatMap 的正确方法?

  17. 17

    在带有 flatmap 的 Scala 中使用 RxJava

  18. 18

    Swift-使用map / reduce / flatmap将数组字典还原为相同类型的单个数组

  19. 19

    Spark map和flatMap结果类型

  20. 20

    在rxJs中与flatMap vs concatMap进行斗争

  21. 21

    无法解析 Option 类型的 Scala flatMap 方法。这样做的正确方法是什么?

  22. 22

    神秘的flatMap:无法flatMap使用新Array(1)创建的内部数组

  23. 23

    神秘的flatMap:无法flatMap使用新Array(1)创建的内部数组

  24. 24

    Java 8 FlatMap-以嵌套形式添加项目并使用FlatMap检索对象

  25. 25

    使用默认值在Scala中进行一般类型解析

  26. 26

    使用IntStream的flatMap方法打印2D数组

  27. 27

    为什么我们需要使用flatMap?

  28. 28

    Scala:如何使用flatMap和Options计算Seq [Double]的方差?

  29. 29

    RxJava-当返回可能为null时使用flatmap

热门标签

归档