gpt4 book ai didi

generics - 在Scala中可转换为结构类型的通用方法

转载 作者:行者123 更新时间:2023-12-04 06:08:04 25 4
gpt4 key购买 nike

为什么我不能这样做:

def compare[A <% { def toInt: Int }, 
B <% { def toInt: Int }]
(bs: Seq[A], is: Seq[B]): Boolean = {
bs.toArray.zip(is) forall { p => p._1.toInt == p._2.toInt }
}

为了比较可转换为 Int 的任何类型的序列?如何实现类似的模式?

更新:这应该运行 Message.compare(List(1.0, 2.0, 3.0), List(0, 0, 0))

最佳答案

问题所在的一个很好的例子似乎是这样做:

val a = implicitly[Int => { def toInt : Int }]
a(1).toInt

Scala 2.9.1 在运行时代码中的某个时候爆炸了 - 我只能认为这是一个错误。

不过,您可以使用类型类实现您正在寻找的效果:以下代码适用于您的所有示例:
def compare[A : Numeric, B : Numeric](bs : Seq[A], cs : Seq[B]) = {
(bs, cs).zipped.forall(implicitly[Numeric[A]].toInt(_) == implicitly[Numeric[B]].toInt(_))
}

这也应该具有比使用结构类型的版本更快的好处。如果你需要添加你自己的类型,应该可以转换为整数,你可以像在 https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src//library/scala/math/Numeric.scala#L1 中所做的那样为 Numeric 类型类提供证据。为标准值。

关于generics - 在Scala中可转换为结构类型的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com