【发布时间】:2019-05-28 23:56:25
【问题描述】:
我正在尝试创建一个具有多个类型参数的类型类。 我正在尝试根据类型隐式调用该方法
我正在展示我尝试过的代码的简单 sn-p。
object operation {
// Define generic trait class
trait Operator[T, U] {
def addition[T, U](l: U, r: T)(implicit p: Parameters): U
}
object Operator {
// Define type class.
implicit object IntOperator extends Operator[Int, Float] {
def addition(l: Int, r: Float): Float = {
r
}
}
}
// Create mapping for implicit call.
def addition[T, U](l: T, r: U)(implicit op: Operator[T, U]): U = op.addition(l, r,)
}
import operation._
def fn(a: UInt, b: Float)
addition(a,b)
如果我使用单个类型参数,即只有 [T,U],那么这段代码编译得很好。但是,如果我使用两个类型参数,即 Operator[T,U] 那么添加(a,b)会抱怨 未找到参数 Operator[T,U] 的隐式。任何帮助将不胜感激。
我希望简化的代码 sn-p 详细说明我正在尝试做的事情。
【问题讨论】:
-
Parameters是在哪里定义的,你为什么不在你的IntOperator上使用它,你为什么还要在 trait 上声明T和U?错字?最后一次添加调用是在fn内部完成的吗?如果不是,a和b是从哪里来的? -
UInt来自spire.math库吗?如果是这样,问题似乎是值类的隐式解析不使用底层类型的解析。 (我在编译你的代码时也遇到了麻烦——你肯定需要从def addition中删除类型参数并更正IntOperator的返回类型,以使其被识别为有效实现。)