Мне нужна перепроверка (пожалуйста).
В статье (http://www.win -vector.com / blog / 2010/06 / автоматическая дифференциация со scala / ), которую я только что написал, я заявил, что это моя вера вScala, что вы не можете указать функцию, которая принимает аргумент, который сам является функцией с несвязанным параметром типа.Я отредактировал этот вопрос, чтобы попытаться упростить пример.
Следующий код работает путем введения черты GenericFn, которая имитирует черту Scala Function1, за исключением того, что в функции есть параметр свободного типа:
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 (использовать стандартную запись функции)?Например, приведенный ниже код завершается с ошибкой во время компиляции: «несоответствие типов; найдено: TypeExample2.A обязательно: _ $ 1, где тип _ $ 1 <: TypeExample2.NumberBase»: </p>
def specializeAndApplyTwice(f:(_<:NumberBase)=>String):String = {
f(new A()) + f(new B())
}