高级类型成员声明之间的区别
Difference between higher-kinded type members declaration
查看 shapeless 库的源代码,我注意到了不同的高级类型成员声明,并想知道它在用法上是否有一些具体的区别。例如通用特征 here:
trait Generic1[F[_], FR[_[_]]] {
type R[t]
// ...
}
trait IsHCons1[L[_], FH[_[_]], FT[_[_]]] {
type H[_]
// ...
}
一个类型成员使用类型构造函数的通用语法声明(即 H[_]
)并且 Generic1
特征具有 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] }
// ...
}
所以我想知道R[t]
和H[_]
有没有区别?
没有区别,因为 t
只是未绑定。您可以在 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>
最后一行编译的事实证明编译器将 T1
和 T2
视为同一类型。
查看 shapeless 库的源代码,我注意到了不同的高级类型成员声明,并想知道它在用法上是否有一些具体的区别。例如通用特征 here:
trait Generic1[F[_], FR[_[_]]] {
type R[t]
// ...
}
trait IsHCons1[L[_], FH[_[_]], FT[_[_]]] {
type H[_]
// ...
}
一个类型成员使用类型构造函数的通用语法声明(即 H[_]
)并且 Generic1
特征具有 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] }
// ...
}
所以我想知道R[t]
和H[_]
有没有区别?
没有区别,因为 t
只是未绑定。您可以在 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>
最后一行编译的事实证明编译器将 T1
和 T2
视为同一类型。