参考化参数化curried函数和占位符表示法

时间:2014-04-25 19:22:50

标签: scala syntax

这很简单(基本的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)
}

是否存在这种情况的语法(即保留类型参数的占位符)或语言是否支持该语言?

1 个答案:

答案 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))