Scala中未命名类型的类型类实例

时间:2013-06-30 01:26:44

标签: scala typeclass

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

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

感谢。

2 个答案:

答案 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.
}