Potreste essere interessati a tipo lambda L'applicazione parziale si è utilizzato nella vostra risposta è in realtà implemented in scalaz Poiché il codice tende ad essere meno leggibile, tuttavia, hanno iniziato a utilizzare il tipo lambdas.Il tipo in questione potrebbe essere scritto come
({type λ[α] = CList[α,A]})#λ
Questo funziona creando una proiezione di tipo su un tipo parametrizzato λ
all'interno di un tipo strutturale, acquisendo così il parametro di tipo esterno (in questo caso A
).
L'altro problema relativo alla varianza descritto nella risposta potrebbe essere risolto impostando il parametro Res
nella covariant Access
.
Dopo queste modifiche il codice dovrebbe apparire così:
trait Access[+Res[_]] { def access[C] : Res[C]}
trait CList[C, +A] extends Access[({type λ[α] = CList[α,A]})#λ]
Grazie, che sembra un po 'meglio. Anche perché nel mio caso reale i parametri di tipo di CList avevano limiti superiori, avendo un carattere dedicato Partial2 non era molto utile (avrei bisogno di aggiungere parametri tipo per i limiti ecc.) –
Anche se i tipi lambda sono usati spesso nel tuo codice, considera il seguente plug-in del compilatore: https://github.com/non/kind-projector –