加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读