2014-05-04 12 views
7

Nel codicePerché un'annotazione della varianza fa sì che questa relazione di sottotitoli non sia desunta da 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 dà l'errore che non è c => cA => B. La rimozione dell'annotazione della varianza in Node[+T] risolve l'errore.

Sono perplesso perché credo che, in presenza dell'annotazione della varianza, la corrispondenza i: I[c] crei la regola (c => c) <:< (A => B), che è tutto ciò che è necessario per la compilazione di tale riga. Cosa mi manca?

+1

I parametri di funzione sono CONTRAvariant sui loro argomenti. Non è una risposta, ma una supposizione. –

+0

@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

+0

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

risposta

0

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)

Problemi correlati