【发布时间】:2014-06-11 15:40:01
【问题描述】:
这是一个简单的问题(基本的 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)
}
是否有这种情况的语法(即保留类型参数的占位符)还是语言根本不支持?
【问题讨论】:
-
一方面,缺少像 Shapeless 这样的东西,Scala
Function不支持参数多态性(不能是“类型通用”)。