scala - 无法理解 Writes 中 contramap 的逻辑
问题描述
我无法理解将单个字段contramap
编写为.case class
json
说我有一个案例类,我想创建它的 json
case class SomeThingContainer (something:SomeThing)
我会写write
如下:
implicit val somethingContainerWrites:Writes[SomeThingContainer] = (
(JsPath \ "something").write[Something]
).contramap{(somethingContainer:SomeThingContainer)=>somethingContainer.something}
如果我有如下模型,则 val somethingContainerVariable = SomethingContainer(something)
在应用程序的某个地方,我会调用toJson[SomeThingContainer]
将模型转换为Json
. Writes[SomeThingContainer]
这将寻找隐含的somethingContainerWrites
. 从这里开始,如何JSON
创建?如果有多个字段,我可以在一定程度上理解它unapply _
的工作原理,但我无法理解contramap
它的魔力如何。
解决方案
contramap
用于组成函子。
AWrites
是一个(逆变)函子X => JsValue
。(它知道如何从给定的 X 创建一个 JsValue)
显然,您已经在Writes[Something]
某个地方定义了一个(因为您正在调用JsPath.write[Something]
它隐含地需要它)。
在括号内,您创建一个新的Writes[Something]
,它只使用前者将 a 写入Something
JSON 对象中的不同路径。
现在,要能够JsValue
从 a创建 a,SomeThingContainer
您需要做的就是将 a 转换SomeThingContainer
为 a Something
- 因为您已经有了 a Writes[Something]
- 并使用它。
这就是 contramap 调用的作用:根据Writes[Something]
您定义的它创建一个新Writes[SomeThingContainer]
的,当给定 a 时SomeThingContainer
,首先调用给定的“转换函数”生成 a Something
。然后,它调用了Writes[Something]
那个。
为了说明, contramap 的作用是:
Writes[X]: Functor[X => JsValue]
C: Y => X
Writes[X].contramap(C) <==> Writes[Y]: Functor[Y => X => JsValue]
推荐阅读
- mysql - 获取过去 7 天以来的行数
- r - 创建具有离散颜色的地图图
- c# - 使用 LINQ 和 SQLServer 将 int 和 string 与前导零进行比较
- java - Java String DateTime 到 toEpochMilli - 不同的区域
- amazon-web-services - 如何在不影响数据库性能的情况下处理流量峰值
- view-scope - 查看参数和@ViewScoped bean:服务器重启后恢复
- django - 无法在 Django 中使用 RadioSelect 按钮来获取输出
- wordpress - 想要在 WordPress Infinite Scroll - Ajax Load More 插件中按总帖子显示当前帖子编号
- sql - 识别 SQL Server 2014 中的行模式
- javascript - 如何在 React 中动态更改状态?