Perché questo non viene compilato?Limitazione dell'inferenza del tipo bizzare - parametri di tipo multiplo
trait Lol[A, SA] {
def flatMap[B, SB](f: A => Lol[B, SB]): Lol[B, SB] = ???
}
val p1: Lol[Int, String] = ???
val p2: Lol[Double, Nothing] = ???
val p5 = p1.flatMap(_ => p2)
Risultato:
found : Int => Lol[Double,Nothing]
required: Int => Lol[Double,SB]
val p5 = p1.flatMap(_ => p2)
^
le cose iniziano a compilare se: (? WTF)
- tipo params di
flatMap
invocazione sono espliciti SA
è covariant- alcuni altro tipo di
Nothing
siamo noi ed inp2
(ad es.Null
) SB
non si verifica il tipo cambio diflatMap
o avviene in posizione covariante di quel tipo di ritorno (ad esempio tipo di ritorno èOption[SB]
)
Le soluzioni precedenti non sono comunque accettabile per me.
Perché l'annotazione della varianza non è un'opzione per te? Di solito è una buona idea usare la varianza laddove possibile. L'uso di 'Nothing' la maggior parte delle volte ha senso solo in base alla varianza. –
@ 0__ 'SA' semplicemente non può essere covariante data l'API completa (non mostrata qui). Comunque - hai ragione sul 'Nothing' - se' SA' non è covariante, probabilmente posso creare il mio tipo speciale invece di usare 'Nothing' – ghik
Tuttavia, questo errore è ancora ridicolmente bizzarro e puzza di bug. – ghik