好问题!您不能使用的原因
map是因为
Writes它不是函子。
您可以将其
Writes[A]视为类似
A => JsValue。但是,假设我有一个
A => JsValue和一个
A =>B。尝试想出一些方法来构成这些函数以获得一个
B => JsValue—这是不可能的。
Reads[A]另一方面,有点像
JsValue => A,并且是一个函子-它具有一种
map方法,该方法采用a
A =>B并将其与
Reads[A]/ 组成
JsValue => A并返回
Reads[B]/
JsValue => B。
Writes但是,它是一个 协变
函子,幸运的是Play知道这一点。当
F是逆函子时,
F[A]有一个方法
contramap[B](f:B => A)代替了通常的方法
map[B](f: A => B)。所以你可以这样写:
case class People(names: Set[Int])import play.api.libs.json._import play.api.libs.functional.syntax._implicit val PeopleWrites: Writes[People] = (__ 'names).write[Set[Int]].contramap(_.names)
这
(__ 'names).write[Set[Int]]是一个
Writes[Set[Int]]并且
(_.names)是一个函数
People=> Set[Int]。与他们结合在一起
contramap给我们一个
Writes[People]。



