4

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

使用的语法是<: Type : Type什么,这是什么意思?我发现语法是TypeParamBounds ::= TypeBounds {‘:’ Type}这里调用的。哪里可以详细了解一下,谢谢。

4

3 回答 3

5

类型边界是以下的简写:

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)
  }

}
于 2021-08-14T03:44:59.373 回答
5

<: Type : 类型,这是什么意思?

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

T <: Data                // subtyping contraint on T
T : Arithmetic           // type class constraint on T
T <: Data : Arithmetic   // subtyping and type class contraint on T

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

于 2021-08-14T10:28:48.400 回答
0

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

Chisel 3.5(尚未发布)引入了一个称为DataView使用类型类实现的新功能。在 DataView 的文档中,我尝试提供一个简短的文档来介绍类型类以及它们为何有用。希望该文档也能帮助解释!

于 2021-08-14T19:27:46.963 回答