在具有类型参数的函数中调用的类型类方法
Typeclasses methods called in functions with type parameters
我正在尝试在带有类型参数的函数中使用类型类方法。不幸的是我无法让它工作。
当我尝试使用方法 addRegisterInOut 时,编译器在以下代码中抛出错误。
class Module extends Component {
// ...
trait HasDataSpecs[T] {
def dataSpecs(datatype: T) : RegisterSpecs
}
implicit object SpecsBool extends HasDataSpecs[Bool] {
override def dataSpecs(datatype: Bool) : RegisterSpecs = {
new RegisterSpecs("", 1)}
}
implicit object SpecsUInt extends HasDataSpecs[UInt] {
override def dataSpecs(datatype: UInt) : RegisterSpecs = {
new RegisterSpecs("", datatype.getBitsWidth)}
}
def dataSpecs[A](a: A)(implicit ds: HasDataSpecs[A]) : RegisterSpecs = ds.dataSpecs(a)
// ...
def addRegisterInOut[T <: Data](name: String, out_data: T) : T = {
var specs = dataSpecs(out_data)
specs.name = name
specs.permission = Permission.RWPerm
registers += specs
out_len += out_data.getBitsWidth
in_len += out_data.getBitsWidth
val in_data = cloneOf(out_data)
in_channels += in_data
out_channels += out_data
in_data
}
}
//... Somewhere I use addRegisterInOut(UInt(...))
我明白了
[error] /home/bellandi/Projects/VHDL/spinalhdl_experiments/src/main/scala/spinal/msk/lib/pkg/RegisterCls.scala:83:26: could not find implicit value for parameter ds: Module.this.HasDataSpecs[T]
[error] var specs = dataSpecs(out_data)
[error] ^
我希望编译器仅在未定义隐式的类型上停止,但它似乎总是发生。
尝试添加context bound
def addRegisterInOut[T <: Data : HasDataSpecs](name: String, out_data: T) : T = ...
我正在尝试在带有类型参数的函数中使用类型类方法。不幸的是我无法让它工作。
当我尝试使用方法 addRegisterInOut 时,编译器在以下代码中抛出错误。
class Module extends Component {
// ...
trait HasDataSpecs[T] {
def dataSpecs(datatype: T) : RegisterSpecs
}
implicit object SpecsBool extends HasDataSpecs[Bool] {
override def dataSpecs(datatype: Bool) : RegisterSpecs = {
new RegisterSpecs("", 1)}
}
implicit object SpecsUInt extends HasDataSpecs[UInt] {
override def dataSpecs(datatype: UInt) : RegisterSpecs = {
new RegisterSpecs("", datatype.getBitsWidth)}
}
def dataSpecs[A](a: A)(implicit ds: HasDataSpecs[A]) : RegisterSpecs = ds.dataSpecs(a)
// ...
def addRegisterInOut[T <: Data](name: String, out_data: T) : T = {
var specs = dataSpecs(out_data)
specs.name = name
specs.permission = Permission.RWPerm
registers += specs
out_len += out_data.getBitsWidth
in_len += out_data.getBitsWidth
val in_data = cloneOf(out_data)
in_channels += in_data
out_channels += out_data
in_data
}
}
//... Somewhere I use addRegisterInOut(UInt(...))
我明白了
[error] /home/bellandi/Projects/VHDL/spinalhdl_experiments/src/main/scala/spinal/msk/lib/pkg/RegisterCls.scala:83:26: could not find implicit value for parameter ds: Module.this.HasDataSpecs[T]
[error] var specs = dataSpecs(out_data)
[error] ^
我希望编译器仅在未定义隐式的类型上停止,但它似乎总是发生。
尝试添加context bound
def addRegisterInOut[T <: Data : HasDataSpecs](name: String, out_data: T) : T = ...