如何在Scala中编码以下约束(伪代码)?
def foo(x: T forSome { type T has a Numeric[T] instance in scope }) = {
val n= implicitly[...] // obtain the Numeric instance for x
n.negate(x) // and use it with x
}
用语言:我需要一个输入参数的类型类实例,但我不关心参数的类型,我只需要获取实例并在我的参数上使用它。
它不一定是存在类型,但我需要避免def
签名中的类型参数。
编辑:只是为了澄清这些情况下的标准方法,即:
def foo[T: Numeric](x: T) = ...
对我不起作用,因为它需要在方法上添加一个类型参数。
感谢。
答案 0 :(得分:1)
我设法让它像这样工作:
implicit class InstanceWithNumeric[T](val inst: T)(implicit val n: Numeric[T])
def foo(iwn: InstanceWithNumeric[_]) {
def genFoo[T](iwn: InstanceWithNumeric[T]) {
println(iwn.n.negate(iwn.inst))
}
genFoo(iwn)
}
现在:
scala> foo(1)
-1
scala> foo(1.2)
-1.2
不是最漂亮,但似乎有效。
编辑:您可以避免像这样定义内部函数:
implicit class InstanceWithNumeric[T](val inst: T)(implicit val n: Numeric[T]) {
def negate = n.negate(inst)
}
此外,如果您想隐式转换为InstanceWithNumeric
全局可见,您可以执行以下操作:
class InstanceWithNumeric[T](val inst: T)(implicit val n: Numeric[T])
object InstanceWithNumeric {
implicit def apply[T: Numeric](inst: T) =
new InstanceWithNumeric(inst)
}
如果你想了解它是如何工作的,请阅读所谓的隐式范围(this question似乎包含了很好的解释)。
答案 1 :(得分:0)
不太确定你在尝试什么,因为一旦你拨打implicitly
,你似乎需要一个类型。以下是否适合您?
def foo(implicit x: Numeric[_]) {
//code goes here.
}