scala - How call function which is return from another one? -


i trying call function marshal httpresponse spray. unmarshal function described here. response httpresponse

consider 3 code variants:

first

val func = unmarshal[mytype] func(response) 

second

unmarshal[mytype].apply(response) 

third

unmarshal[mytype](response) 

why third code variant not compile while first 2 works? compiler returns:

[error]  found   : spray.http.httpresponse [error]  required: spray.httpx.unmarshalling.fromresponseunmarshaller[mytype] [error]     (which expands to)  spray.httpx.unmarshalling.deserializer[spray.http.httpresponse,mytype] [error]         unmarshal[mytype](response) 

is there way call function returned unmarshal more elegant create temp variable or direct call apply method?

the signature of function (from link):

  def unmarshal[t: fromresponseunmarshaller] 

so t needs implicit evidence there's such fromresponseunmarshaller it. signature compiles like:

 def unmarshal[t](implicit evidence$1: fromresponseunmarshaller[t]): httpresponse ⇒ t 

that means, unmarshal function takes implicit parameter should transform mytype httpresponse.

in first example, call val func = unmarshal[mytype] makes compiler insert implicit you. in 3rd example,

 unmarshal[mytype](response) 

response taking position of implicit parameter, supposed fromresponseunmarshaller, not httpresponse.

such call need be:

unmarshal[mytype](fromresponseunmarshsaller)(response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^        original method call          here apply response returned function. 

Comments

Popular posts from this blog

java - UnknownEntityTypeException: Unable to locate persister (Hibernate 5.0) -

python - ValueError: empty vocabulary; perhaps the documents only contain stop words -

ubuntu - collect2: fatal error: ld terminated with signal 9 [Killed] -