2015-08-11 10 views
5

Guardando alle fonti per la libreria informe, ho prestato attenzione a diverse dichiarazioni dei membri di tipo superiore e chiedendomi se ha qualche differenza concreta nell'utilizzo. Per esempio tratto generico here:Differenza tra i membri di tipo superiore della dichiarazione dei membri

trait Generic1[F[_], FR[_[_]]] { 
    type R[t] 
    // ... 
} 

trait IsHCons1[L[_], FH[_[_]], FT[_[_]]] { 
    type H[_] 
    // ... 
} 

Un membro del tipo è dichiarato con una sintassi comune per costruttori di tipo (cioè H[_]) e Generic1 tratto ha R[t]. Anche se gli alias di tipo ausiliari sono definiti in modo simile:

object Generic1 { 
    type Aux[F[_], FR[_[_]], R0[_]] = Generic1[F, FR] { type R[t] = R0[t] } 
    // ... 
} 

object IsHCons1 { 
    type Aux[L[_], FH[_[_]], FT[_[_]], H0[_], T0[_] <: HList] = IsHCons1[L, FH, FT] { type H[t] = H0[t] ; type T[t] = T0[t] } 
    // ... 
} 

Quindi mi chiedo se R[t] e H[_] ha alcuna differenza o no?

risposta

6

Non c'è differenza, poiché t non è associato. Si può facilmente verificare questo nel REPL:

scala> type T1 = { type R[t] } 
defined type alias T1 

scala> type T2 = { type R[_] } 
defined type alias T2 

scala> implicitly[T1 =:= T2] 
res0: =:=[T1,T2] = <function1> 

Il fatto che l'ultima riga compila dimostra che il compilatore vede T1 e T2 come lo stesso tipo.

+0

Sì ... non c'è alcun motivo valido per cambiarlo, ma la prossima volta che toccherò le cose in quell'area probabilmente altererò la definizione astratta di 'R' in' tipo R [_] '. Anche le PR sono benvenute :-) –

Problemi correlati