【问题标题】:Reference parameterized curried function with placeholder notation使用占位符表示法引用参数化柯里化函数
【发布时间】: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 不支持参数多态性(不能是“类型通用”)。

标签: scala syntax


【解决方案1】:

您可以阅读博客系列的博文,深入了解为什么会这样: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))

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 2016-01-01
    • 2021-02-07
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多