说我有这样的事情:
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)
}
这有什么标准类吗?