【发布时间】:2013-06-30 17:36:33
【问题描述】:
如何在 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) = ...
对我不起作用,因为它需要在方法上添加类型参数。
谢谢。
【问题讨论】:
-
为什么不能添加类型参数?
-
因为它是方法中的第二个类型参数,我不想向用户公开。而且因为它是第二个,所以如果不推断第一个就无法推断,但在我的情况下,原则上不能推断出第一个。而且因为整个事情都是围绕宏发生的,所以我不能使用类似于:stackoverflow.com/a/10734268/1274237 的东西,因为宏不能被部分应用。
-
没有第二个类型参数。扩展为
def foo[T](x: T)(implicit num: Numeric[T]) = ...。据我所知,这是一种类型参数。 -
我的意思是,在我的实际使用中,这将是第二个参数。