在 Scala 中绑定的类型之后的另一个子类型

Another subtype after a type bound in scala

class PEControl[T <: Data : Arithmetic](accType: T),这是来自 riscv-gemmini 的 class 定义。 Data类型是chisel中的基本数据类型,Arithmetic提供了对Data的一些算术运算,abstract class Arithmetic[T <: Data].

<: Type : Type使用的语法是什么,什么意思? 我发现语法从 here 调用 TypeParamBounds ::= TypeBounds {‘:’ Type}。我在哪里可以得到它的一些细节,谢谢。

类型范围是 shorthand 用于:

class PEControl[T <: Data : Arithmetic](accType: T)

// equivalent to

class PEControl[T <: Data](accType: T)(implicit noName: Arithmetic[T])

// which means in both cases in the body of your class 
// you can summon instances of arithmetic for all Ts

class PEControl[T <: Data : Arithmetic](accType: T) {

  def doSomethingWithT(t1: T, t2: T): Unit = {
    implicitly[Arithmetic[T]].plus(t1, t2)
  }

}

<: Type : Type, what does this mean?

Scala 结合了面向对象的概念和函数式编程概念。例如,在 Scala 中,可以使用子类型约束和类型 class 约束

来约束类型参数
T <: Data                // subtyping contraint on T
T : Arithmetic           // type class constraint on T
T <: Data : Arithmetic   // subtyping and type class contraint on T

在这两种情况下,这些编译时约束的要点是告诉编译器类型参数 T 提供了哪些功能,即我们可以对类型 T 的值调用哪些方法。决定对你的类型参数施加什么样的约束是一个设计决策。一些程序员喜欢使用类型 classes 的参数多态性的纯函数式编程方法,其他人更喜欢更面向对象的子类型方法,还有一些人认为我们仍然没有探索 Scala 提供的混合方法的真正力量。无论哪种方式,Scala 都不会为您做出决定。作为旁注,在某些语言(例如 Rust)中,不鼓励或完全删除子类型多态性。

Mario 的回答很好地讨论了不同类型的多态性,而 SimY4 的回答显示了 类 类型如何在 Scala 中通过隐式实现的机械细节。

Chisel 3.5(尚未发布)引入了一个名为 DataView 的新功能,它是使用类型 类 实现的。 In the documentation for DataView 我试图提供一个简短的文档来介绍类型 类 以及它们为什么有用。希望该文档也能帮助解释!