Hai problemi con il tipo di "tipi":tipi non conformi con il tipo di lambda
trait Sys[ S <: Sys[S]]
trait Expr[S <: Sys[S], A]
trait Attr[S <: Sys[S], A[_]]
def test[ S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???
Questo viene a mancare con
error: kinds of the type arguments (S,[x <: Sys[x]]Expr[x,Int]) do not conform
to the expected kinds of the type parameters (type S,type A) in trait Attr.
[x <: Sys[x]]Expr[x,Int]'s type parameters do not match type A's expected parameters:
type x's bounds <: Sys[x] are stricter than type _'s declared bounds >: Nothing <: Any
def test[S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???
^
Qual è il problema con i limiti dichiarati? Devo portare quel tipo parzialmente applicato in cr * ppy nel costruttore del tipo di trait Attr
? E perché? Posso risolvere questo problema senza toccare la definizione di Attr
?
ho bisogno i limiti in funzione test
in modo che l'attuazione di lavorare, ma io non vuole proliferare questi limiti per l'interfaccia pubblica Attr
.
Nota: Se io uso un tipo di membro (ciò che non voglio), funziona:
trait Attr[S <: Sys[S]] { type A[_]}
def test[ S <: Sys[S]]: Attr[S] { type A[S <: Sys[S]] = Expr[S, Int]} = ???
Grazie per l'analisi. Ha senso, anche se "avendo un' A [_] '" mentre ti permette di chiamare il "type constructor" 'A [Any]', non puoi chiamare un costruttore di valori, quindi in termini di runtime questo andrebbe bene IMO. D'altra parte, immagino che potrebbe causare problemi con la meta-programmazione in fase di compilazione utilizzando i vincoli di tipo? Alla fine, la soluzione (almeno per quanto ho usato finora) è semplice. Il sito di utilizzo non può fare molto con 'A [_]' comunque e questa informazione di tipo è più per il chiamante di 'test', così ho sostituito' A1 = A [_] 'in' Attr' e 'test' quindi restituisce' Attr [S, Expr [S, Int]] '. –