这很简单(基本的Scala语法问题)。假设我有一个curried函数,它使用参数化类型作为其返回值:
def elapsedNanos[R](repetitions: Int)(functionToTime: => R): Tuple2[R, Long] = {
val start = System.nanoTime()
for (i <- 1 until repetitions) {
functionToTime
}
(functionToTime, System.nanoTime() - start)
}
我想通过修复第一个参数列表来引用它。如下所示,我显然可以重新声明类型参数并将其传递,我想知道代码是否可以使用占位符变得更加冗长:
// this works:
def execOnceElapsedNanos[R](functionToTime: => R) =
elapsedNanos(1)(functionToTime)
// this does not work:
def execOnceElapsedNanos = elapsedNanos(1)_
在第二种情况下,当使用占位符时,参数化(?原谅我的英语,而不是母语者)会丢失:
val (f: Long, elapsed: Long) = elapsedNanos {
fibonacci(50)
}
是否存在这种情况的语法(即保留类型参数的占位符)或语言是否支持该语言?
答案 0 :(得分:0)
您可以阅读博客系列博客文章,深入了解其发生的原因:http://www.chuusai.com/2012/04/27/shapeless-polymorphic-function-values-1/。
作为一个简单的解决方法,我会使用这样的东西:
def oneRep[T] = new ((T) => (T, Long)) {
def apply(v1: T): (T, Long) = elapsedNanos(1)(v1)
}
println(oneRep(2+2))