在 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 我试图提供一个简短的文档来介绍类型 类 以及它们为什么有用。希望该文档也能帮助解释!
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 我试图提供一个简短的文档来介绍类型 类 以及它们为什么有用。希望该文档也能帮助解释!