gpt4 book ai didi

scala - 向通用集合添加成对差异 - 隐式解析不起作用

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

好的,所以我有这个:

implicit final class RichIterableLike[A, Repr <: IterableLike[A, Repr]](val it: Repr) 
extends AnyVal {
def pairDiff[To](implicit num: Numeric[A], cbf: CanBuildFrom[Repr, A, To]): To = {
val b = cbf(it)
val iter = it.iterator
if (iter.hasNext) {
var pred = iter.next()
while (iter.hasNext) {
import num.mkNumericOps
val succ = iter.next()
b += succ - pred
pred = succ
}
}
b.result()
}
}

可以编译,但不会启动:

val stabs = IndexedSeq(1.0, 2.0, 3.0)
stabs.pairDiff

给出:值pairDiff不是IndexedSeq[Double]的成员

显式转换有效:

new RichIterableLike[Double, IndexedSeq[Double]](stabs).pairDiff

...如何解决这个问题?

<小时/>

编辑

如果我应用该方法of this answer ,它有效:

implicit final class RichIterableLike[A, CC[~] <: Iterable[~]](val it: CC[A]) 
extends AnyVal {
def pairDiff[To](implicit num: Numeric[A], cbf: CanBuildFrom[CC[A], A, To]): To = {
...
}

但问题仍然存在,在后一种情况下使隐式查找生效的关键区别是什么。

最佳答案

为了使隐式查找起作用,它需要 ARepr 之间的链接(IterableLike 需要该链接)。您将其作为参数传递,因此该参数的类型应为 Repr[A]。这意味着您需要修改您的签名,使其看起来像这样:

RichIterableLike[A, Repr[X] <: IterableLike[X, Repr[X]]](val it: Repr[A])

通过上述签名,您可以说:

I have an object that accepts a type parameter, I will name that object Repr and when you pass it in I would like to capture the type parameter as well. I will name that type parameter A. As an extra condition I want the type of Repr to conform to the signature of IterableLike

关于scala - 向通用集合添加成对差异 - 隐式解析不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15382699/

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