gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:37:30 25 4
gpt4 key购买 nike

查看 shapeless library 的来源,我注意到不同的高级类型成员声明,​​并想知道它在使用上是否有一些具体的区别。例如通用特征 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只是未绑定(bind)。您可以在 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作为同一类型。

关于scala - 高级类型成员声明之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31937561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com