2015-08-11 6 views
5

Mit Blick auf die Quellen für Shapeless-Bibliothek, ich habe Aufmerksamkeit auf verschiedene höher-kinged Typ Member-Deklaration und fragen, ob es einige konkrete Unterschiede in der Verwendung hat. Zum Beispiel generischen Merkmal here:Unterschied zwischen Member-Deklaration höher-kinged Typ

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

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

Ein Typ Element ist mit einer gemeinsamen Syntax für Typkonstruktoren erklärt (das heißt H[_]) und Generic1 Eigenschaft hat R[t].

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

So frage ich mich, wenn R[t] und H[_] einen Unterschied haben oder nicht: Obwohl Hilfs Typ-Aliasnamen in ähnlicher Weise definiert werden?

Antwort

6

Es gibt keinen Unterschied, da t gerade nicht gebunden ist. Sie können dies leicht in der REPL überprüfen:

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> 

Die Tatsache, dass die letzte Zeile beweist kompiliert, dass der Compiler T1 und T2 als die gleiche Art sieht.

+0

Yup ... es gibt keinen zwingenden Grund, es zu ändern, aber wenn ich das nächste Mal Dinge in diesem Bereich berühre, werde ich höchstwahrscheinlich die abstrakte Definition von 'R' zu' Typ R [_] 'ändern. PRs sind auch willkommen :-) –

Verwandte Themen