【问题标题】:Difference between higher-kinded type members declaration高级类型成员声明之间的区别
【发布时间】:2015-11-03 10:19:29
【问题描述】:

查看无形库的来源,我注意到不同的高级类型成员声明,​​想知道它在使用上是否有一些具体的区别。例如通用特征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[_]有什么区别吗?

【问题讨论】:

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


    【解决方案1】:

    没有区别,因为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 视为同一类型。

    【讨论】:

    • 是的......没有令人信服的理由来改变它,但下次我触及那个领域的东西时,我很可能会将R 的抽象定义更改为type R[_]。也欢迎 PR :-)
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2020-04-20
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多