Scala currying和类型参数的问题

时间:2014-02-21 15:21:50

标签: scala currying

说我有这样的事情:

def curriedHelper[T](foo: String)(f: String => T) = f(foo)

这只是简化的事情。重点是我有一些工作要做,然后应用另一个转换,其结果类型尚未确定。也许foo这里是db-collection名称,f是从DB-cursor到不同记录类型的函数。

这里Scala的讨论对我来说不合适,因为T需要在部分应用中得到修复。它简直没用,因为Scala将T修复为Nothing:

scala> val partiallyAppliedToNothing = curriedHelper("bar") _
partiallyAppliedToNothing: (String => Nothing) => Nothing = <function1>

所以我通常做了像

这样的事情
def curriedHelper2(foo: String) = new {
  def apply[T](f: String => T) = f(foo)
}

val better = curriedHelper2("bar")

然而,我刚才注意到这是使用反射

val usesReflection = better{ x =>
    try {
    throw new NullPointerException
  } catch {
    case e => e.printStackTrace
  }
  x
}

Stacktrace显示用于调用apply的反射。我无法理解为什么这需要像结构类型一般反映出来。可能只是一个内部阶级,对吗?

所以我想唯一剩下的就是命名这个来避免反思:

trait WhatDoICallThis[F] {
  def apply[T](f: (F => T)): T
}

def curriedHelper3(foo: String) = new WhatDoICallThis[String] {
  def apply[T](f: String => T) = f(foo)
}

这有什么标准类吗?

0 个答案:

没有答案