Scala可以在参数中允许自由类型参数(Scala类型参数是一等公民?)
发布时间:2020-12-16 18:44:34 所属栏目:安全 来源:网络整理
导读:我有一些 Scala代码,它使用两个不同版本的类型参数化函数做了一些很好的事情.我已经从我的应用程序中简化了很多,但最后我的代码充满了w(f [Int],f [Double])的调用,其中w()是我的魔术方法.我希望有一个更神奇的方法,如z(f)= w(f [Int],f [Double]) – 但我不
我有一些
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 function that takes a single type-parameterized function as an // argument and then speicalizes the the argument-function to two different types,// i.e. a single-argument version of w() (or wrapper) } } 解决方法
你可以这样做:
trait Forall { def f[Z] : Z=>Z } def z(u : Forall) = w(u.f[Int],u.f[Double]) 或者使用结构类型: def z(u : {def f[Z] : Z=>Z}) = w(u.f[Int],u.f[Double]) 但这比第一个版本慢,因为它使用反射. 编辑:这是你如何使用第二个版本: scala> object f1 {def f[Z] : Z=>Z = x => x} defined module f1 scala> def z(u : {def f[Z] : Z=>Z}) = (u.f[Int](0),u.f[Double](0.0)) z: (AnyRef{def f[Z]: (Z) => Z})(Int,Double) scala> z(f1) res0: (Int,Double) = (0,0.0) 对于第一个版本,添加f1扩展Forall或简单 scala> z(new Forall{def f[Z] : Z=>Z = x => x}) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |