Scala tipo parzialmente applicata costruttore inferenza
-
13-10-2019 - |
Domanda
sto usando scala-2.8.1 e scalaz-5.0 . Qualcuno può spiegare esattamente perché un PartialApply1Of2
può essere inferrred in un caso ma non nell'altro?
scala> 1.success[String] <|*|> "Bah".fail[Int]
res1: scalaz.Validation[String,(Int, Int)] = Failure(Bah)
che ha funzionato, anche se ( come è stato chiesto prima !) Il metodo <|*|>
è su MA
che ha un parametro di tipo, non due (come Validation
ha). Non riesco a unicode lavorare nel mio IDEA REPL, quindi ecco qui:
object testy {
def main(args: Array[String]) {
import scalaz._
import Scalaz._
val ps = NonEmptyList(1.success[String], "Bah".fail[Int])
val res = ps.∘∘((_ : Int) % 2 == 0) //DOES NOT COMPILE
println(res)
}
}
I può fornire un tipo specifico per la chiamata e tutto è buono. Perché può scalac
non inferire questo?
ps.∘∘[PartialApply1Of2[Validation, String]#Apply, Int, Boolean]((_ : Int) % 2 == 0)
Nel mio REPL, questo in realtà causa un errore scalac, piuttosto che un messaggio di errore ragionevole
Soluzione
Nel primo caso, la vista implicito ValidationMA
si deduce, e il Int
l'argomento tipo è dedotta:
Scalaz.ValidationMA(1.success[String]).<|*|>[Int]("Bah".fail[Int])
Nel secondo caso, l'argomento di tipo al metodo ∘∘
non si può dedurre, fino # 2712 viene affrontato.
Ho il sospetto che l'errore interno scalac che hai incontrato è legato alla # 2741 / # 4079 . Se è così, è possibile riscrivere con un tipo Lambda per aggirare l'errore.
ps.∘∘[({type X[a]=Validation[String, a]})#X, Int, Boolean]((_ : Int) % 2 == 0)
Mi consiglia di utilizzare questa sintassi invece di PartialApplyNofM
in tutti i casi, come trovo più leggibile. Con una recente build di IntelliJ, si può anche attivare un codice pieghevole (Impostazioni, codice di stile, Scala, pieghevoli, tipo Lambas), nascondere alcune sintattica disordine .