Disclaimer: c
in fase di esecuzione viene cancellato e la corrispondenza non funziona correttamente. Si sono corrispondenti sul I[_]
Nel caso la vostra Node
è invariante Node[A]
è una sottoclasse di Node[B]
solo se e solo se A=B
. Questo costringe
n
passato al test[A, B](n: Node[A => B])
per essere davvero Node[A => B]
Se ragionare verso il basso, se il vostro n
corrisponde a un modello I[Something]
per qualsiasi Something
, A e B deve di tipo Something
Nel caso in cui il nodo è covariante, a causa della definizione di Function1[-A,+B]
si può avere una chiamata a
test[A,B](n)
dove n
è Node[A1 =>B1]
dove A1>:A
e B1<:B
(equazione 1)
quindi se il vostro n
corrisponde a un I[C]
significa che A1 = C
e B1 = C
Se si sostituisce C
nel equazione 1, si otterrà C >: A
e C<:B
(equazione 2)
Pertanto la seguente assegnazione non è valida più
f: A => B = C => C
Per la sinistra di essere assegnabile dalla destra, abbiamo bisogno C => C
essere Function1[-A,+B]
Ciò significa che A >: C
e B <: C
ma la formula 2 sappiamo che questo non regge (eccetto per il caso C = A e C = B, e non ci sono prove a riguardo, a meno che il tuo nodo non sia invariante)
I parametri di funzione sono CONTRAvariant sui loro argomenti. Non è una risposta, ma una supposizione. –
@MikeG. Mi chiedevo se questo potesse essere coinvolto, ma non riesco a vedere come - la varianza di '=>' non sembra essere in gioco qui. Naturalmente, se ho ragione, dovrei essere in grado di riprodurre questo esempio senza tipi di funzione e dovrebbe ancora fallire. Forse ci proverò. – Owen
Dopo qualche ulteriore sperimentazione questo sembra non essere correlato alla varianza di '=>' ...o anche per '=>' in particolare, ma sembra avere qualcosa a che fare con la variabile di tipo ripetuto in 'c => c'. Ancora non sono sicuro del perché questo sia importante. – Owen