W kodzieDlaczego adnotacja o wariancji powoduje, że ta relacja podrzędna nie jest wywnioskowana przez Scala?
sealed trait Node[+T]
case class I[C]() extends Node[C => C]
def test[A, B](n: Node[A => B]) = n match {
case i: I[c] =>
val cId: c => c = identity _
val ab: A => B = cId
}
Scala daje błąd, że nie jest A => B
c => c
. Usunięcie adnotacji o wariancji w Node[+T]
rozwiązuje problem.
Jestem zdziwiony, ponieważ uważam, że w obecności adnotacji o wariancji, mecz i: I[c]
powinien stworzyć regułę (c => c) <:< (A => B)
, która jest wszystkim, czego potrzeba do kompilacji tej linii. czego mi brakuje?
Parametry funkcji są KONTRAVARANT na ich argumentach. To nie jest odpowiedź, ale domysły. –
@MikeG. Hm Zastanawiałem się, czy to może być w to zaangażowane, ale nie widzę jak - wariancja '=>' nie wydaje się tu być w grze. Oczywiście, jeśli mam rację, powinienem móc odtworzyć ten przykład bez typów funkcji i powinien on nadal zawieść. Może spróbuję tego. – Owen
Po dalszych eksperymentach wydaje się, że nie jest to związane z wariancją '=>' ...lub nawet do '=>' konkretnie, ale wydaje się, że ma coś wspólnego z powtarzającą się zmienną typu w 'c => c'. Wciąż nie jestem pewien, dlaczego to ma znaczenie. – Owen