2015-08-11 35 views
5

Gölgesiz kütüphane için kaynaklara baktığımda, farklı türden daha fazla üye beyanına dikkat ettim ve kullanımda somut bir fark olup olmadığını merak ettim. Örnek genel özellik here için:Daha iyi nazik tipteki üyeler arasındaki fark beyanı

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

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

bir tipi elemanı tipi kurucular için ortak sözdizimi (yani H[_]) ile bildirilir ve Generic1 özellik R[t] sahiptir. Yardımcı tip diğer adları benzer bir şekilde tanımlanmıştır rağmen:

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] } 
    // ... 
} 

Yani ben R[t] ve H[_] herhangi bir fark vardır olmadığını merak?

cevap

6

t yalnızca ilişkisiz olduğundan fark yoktur. Kolayca repl içinde doğrulayabilirsiniz:

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> 

son satır derler gerçeği derleyici aynı tip olarak T1 ve T2 gördüğünü kanıtlıyor.

+0

Yup ... bunu değiştirmek için zorlayıcı bir sebep yok, ama bir dahaki sefere bu bölgedeki şeylere dokunuyorum, muhtemelen R'nin soyut tanımını R [_] 'olarak değiştireceğim. PRs ayrıca hoşgeldiniz :-) –