gpt4 book ai didi

scala - 将通用追加函数迁移到 Scala 2.13 集合

转载 作者:行者123 更新时间:2023-12-01 23:05:05 25 4
gpt4 key购买 nike

我有以下扩展类,它将 myAppend 方法添加到任何 SeqLike 中。

implicit class WithAppend[A, R](s: SeqLike[A, R]) extends AnyVal {
def myAppend(i: A)(implicit cbf: CanBuildFrom[R, A, R]): R = s :+ i
}

如何将此代码移植到 Scala 2.13 并保留类似的性能特征?如果扩展类可以保持 AnyVal

,则可获得奖励积分

我尝试过的一些事情:

class Extends1[R, S <: IsSeq[R]](c: R, isSeq: S) {
def myAppend(a: isSeq.A): R = (isSeq(c) :+ a).asInstanceOf[R]
}

但是 asInstanceOf 令人失望 - 它安全吗?

我可以做:

class Extends3[S[_], A](c: SeqOps[A, S, S[A]]) {
def myAppend(a: A): S[A] = c :+ a
}

但现在我们仅限于 S[A] 形式的集合,而 Scala 2.12 代码可以采用任何 R

最佳答案

我可以想出一个无需强制转换即可工作的方法签名和实现:

implicit class WithAppend[Repr](private val repr: Repr) extends AnyVal { 
def myAppend[A0, C](a: A0)(
implicit
isSeq: IsSeq[Repr]{ type A = A0 },
b: BuildFrom[Repr, A0, C]
): C = b.fromSpecific(repr)(isSeq(repr) :+ a)
}

很难保证其性能,但我怀疑它会比你以前的性能差很多。另一种选择是b.newBuilder(repr).addAll(isSeq(repr)).addOne(a).result() .

scala> List(1,2).myAppend(3)
res3: List[Int] = List(1, 2, 3)

scala> Vector(1,2).myAppend(3)
res4: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)

scala> "Strin".myAppend('g')
res5: String = String

关于scala - 将通用追加函数迁移到 Scala 2.13 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55212607/

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