我需要回复(请)。
在我写的一篇文章(http://www.win-vector.com/blog/2010/06/automatic-differentiation-with-scala/)中我说过,我相信Scala你不能指定一个函数,它接受一个本身就是一个带有未绑定类型参数的函数的参数。我已编辑此问题以尝试简化示例。
以下代码通过引入模仿Scala Function1特征的特征GenericFn来工作,除了它在函数中有一个free-type参数:
object TypeExample {
trait NumberBase {
def result:String
}
class A extends NumberBase {
def result = "A"
}
class B extends NumberBase {
def result = "B"
}
trait GenericFn {
def apply[X<:NumberBase](x:X):String
}
def specializeAndApplyTwice(f:GenericFn):String = {
f[A](new A()) + f[B](new B())
}
def main(args : Array[String]) : Unit = {
val f = new GenericFn {
def apply[X<:NumberBase](x:X):String = { x.result }
}
println(specializeAndApplyTwice(f))
}
}
这样可行,但有没有GenericFn特性(使用标准函数表示法)的方法呢?例如,下面的代码失败,出现编译时错误:“type mismatch; found:TypeExample2.A required:_ $ 1 where type _ $ 1&lt;:TypeExample2.NumberBase”:
def specializeAndApplyTwice(f:(_<:NumberBase)=>String):String = {
f(new A()) + f(new B())
}
答案 0 :(得分:2)
重申问题的最初动机:我们想给值'g'一个类型,因为我们想要传递它。 Scala值(当然)不能具有多态类型,即使它们是函数值。那么如何给出一部分未知的类型?
所以我相信一种解决方案是使用通配符(一种存在抽象形式):
def g(f: Array[_ <: NumberBase[_]] => Double, z: Array[Double]): Double
对g类型的散文解释是:从Array [T]和Array [Double]到Double的函数,其中T是某些类型,它扩展了Double。 “some”是表示存在抽象的词,我们要求这种类型存在,尽管我们现在并不关心它是哪一种。