首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型参数函数中调用的Typeclasses方法

类型参数函数中调用的Typeclasses方法
EN

Stack Overflow用户
提问于 2019-08-27 13:37:13
回答 1查看 62关注 0票数 0

我试图在带有类型参数的函数中使用类型方法。不幸的是我没能让它开始工作。

当我尝试使用addRegisterInOut方法时,编译器会对下面的代码抛出一个错误。

代码语言:javascript
复制
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(...))

我得到了

代码语言:javascript
复制
[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]                          ^

我希望编译器只在未定义隐式的类型上停止,但它似乎总是发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-27 13:45:05

尝试添加上下文约束

代码语言:javascript
复制
def addRegisterInOut[T <: Data : HasDataSpecs](name: String, out_data: T) : T = ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57675918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档