我需要反击(请).
在一篇文章(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))
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但有没有一种方法可以在没有GenericFn特征的情况下执行此操作(使用标准函数表示法)?例如,下面的代码失败并出现编译时错误:"type mismatch; found:TypeExample2.A required:_ $ …
我有一些Scala代码,它使用两个不同版本的类型参数化函数做了一些很好的事情.我从我的应用程序,但最终我的代码完全形式的通话简化这个了很多w(f[Int],f[Double])地方w()是我的魔术方法.我希望有一个更神奇的方法z(f) = w(f[Int],f[Double])- 但我不能得到任何语法z(f[Z]:Z->Z),因为它看起来(对我来说)函数参数不能有自己的类型参数.这是Scala代码段的问题.
有任何想法吗?宏可以做到,但我不认为那些是Scala的一部分.
object TypeExample {
def main(args: Array[String]):Unit = {
def f[X](x:X):X = x // parameterize fn
def v(f:Int=>Int):Unit = { } // function that operates on an Int to Int function
v(f) // applied, types correct
v(f[Int]) // appplied, types correct
def w[Z](f:Z=>Z,g:Double=>Double):Unit = {} // function that operates on two functions
w(f[Int],f[Double]) // works
// want something like this: def z[Z](f[Z]:Z=>Z) = w(f[Int],f[Double])
// a type parameterized …Run Code Online (Sandbox Code Playgroud)