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

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top