高等级类型成员声明之间的区别

时间:2015-08-11 09:06:27

标签: scala syntax types shapeless higher-kinded-types

看看无形图书馆的来源,我已经注意到了不同的高级会员类型声明,并想知道它是否在使用上有一些具体的差异。例如,通用特征here

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

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

声明一个类型成员使用类型构造函数的通用语法(即H[_])和Generic1 trait具有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[_]是否有任何区别?

1 个答案:

答案 0 :(得分:6)

没有区别,因为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>

最后一行编译的事实证明编译器将T1T2看作同一类型。