1

如何在 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) = ...

对我不起作用,因为它需要在方法上添加类型参数。

谢谢。

4

2 回答 2

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)
}

如果您想了解这是如何工作的,请阅读所谓的隐式范围这个问题似乎包含很好的解释)。

于 2013-06-30T09:04:46.213 回答
0

不太确定你在尝试什么,因为一旦你调用implicitly. 以下内容对您有用吗?

def foo(implicit x: Numeric[_]) {
   //code goes here.
}
于 2013-06-30T06:38:21.790 回答