如何在Scala中将类型参数化参数专门化为多个不同类型?

时间:2010-06-15 18:19:02

标签: function scala types

我需要回复(请)。

在我写的一篇文章(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())
}

1 个答案:

答案 0 :(得分:2)

重申问题的最初动机:我们想给'g'一个类型,因为我们想要传递它。 Scala值(当然)不能具有多态类型,即使它们是函数值。那么如何给出一部分未知的类型?

所以我相信一种解决方案是使用通配符(一种存在抽象形式):


  def g(f: Array[_ <: NumberBase[_]] => Double, z: Array[Double]): Double

对g类型的散文解释是:从Array [T]和Array [Double]到Double的函数,其中T是某些类型,它扩展了Double。 “some”是表示存在抽象的词,我们要求这种类型存在,尽管我们现在并不关心它是哪一种。