title: Scala error while resolving overloaded methods
body: <p>Im getting the following error while trying to use the Play `s Json library for de-serializing json string. I understand it is failing to resolve to an overloaded method but Im failing to understand why?</p>
  
  <pre><code>Error:(45, 50) overloaded method value apply with alternatives:
    [B](f: B =&gt; (String, String, com.model.ESource.Value, com.model.Address, java.time.ZonedDateTime, java.time.ZonedDateTime))(implicit fu: play.api.libs.functional.ContravariantFunctor[play.api.libs.json.Reads])play.api.libs.json.Reads[B] &lt;and&gt;
    [B](f: (String, String, com.model.ESource.Value, com.model.Address, java.time.ZonedDateTime, java.time.ZonedDateTime) =&gt; B)(implicit fu: play.api.libs.functional.Functor[play.api.libs.json.Reads])play.api.libs.json.Reads[B]
   cannot be applied to (com.model.Event.type)
        (JsPath \ "startTime").read[ZonedDateTime] and
                                                       ^
  </code></pre>
  
  <p>the above exception is caused by ( Im using Play's JSON library - <code>import play.api.libs</code> ):</p>
  
  <pre><code>case class Event(name: String,
                   sourceId: String,
                   sourceType: ESource.ESource,
                   address: Address,
                   startTime: ZonedDateTime,
                   endTime: ZonedDateTime) {
    val id = Array( name, startTime, endTime ).mkString("-")
  
    def toJsonString(): String = Json.toJson(this)(Event.jsonWrites).toString()
  
    def fromJsonString(jsonString: String): Event = {
      val jv = Json.parse(jsonString)
      Json.fromJson[Event](jv)(Event.jsonReads).get
    }
  }
  
  object Event {
    val jsonWrites: Writes[Event] = (
      (JsPath \ "name").write[String] and
        (JsPath \ "sourceId").write[String] and
        (JsPath \ "sourceType").write[ESource.ESource] and
        (JsPath \ "address").write[Address](Address.jsonWrites) and
        (JsPath \ "startTime").write[ZonedDateTime] and
        (JsPath \ "endTime").write[ZonedDateTime]
      )(unlift(Event.unapply))
  
    val jsonReads: Reads[Event] = (
      (JsPath \ "name").read[String] and
        (JsPath \ "sourceId").read[String] and
        (JsPath \ "sourceType").read[ESource.ESource] and
        (JsPath \ "address").read[Address](Address.jsonReads) and
        (JsPath \ "startTime").read[ZonedDateTime] and
        (JsPath \ "endTime").read[ZonedDateTime]
      )(Event)
  }
  </code></pre>
  
  <p>Im not even sure what the syntax actually means? I see that <code>=&gt;</code> is used for anonymous functions where the right side are arguments and left would be the function expression. But Im not sure what the B in the exception refers to and how the 2 method signatures are to be interpreted?</p>