Я пытался понять Writes[T] на более глубоком уровне, чем просто принять, что он работает, как я знаю. Что меня смущает, так это то, что после неприменения и отмены T я понимаю, что вы закончили с кортежем значений. Как сопоставить эти значения с нужным местом, если они все одного типа, например Doubles, как показано ниже? Я задавался вопросом, связано ли это с порядком комбинаторов, но локальные эксперименты, кажется, показывают мне, что порядок не важен. Пример со страницы ScalaJsonCombinators в Play Docs:
case class Location(lat: Double, long: Double)
import play.api.libs.json._
import play.api.libs.functional.syntax._
implicit val locationWrites: Writes[Location] = (
(JsPath \ "lat").write[Double] and
(JsPath \ "long").write[Double]
)(unlift(Location.unapply))