gpt4 book ai didi

scala - 扩展方法中无法识别带有类型标记的集合

转载 作者:行者123 更新时间:2023-12-02 21:41:11 25 4
gpt4 key购买 nike

我想使用tagged types指示集合是否已排序。例如:

type Tagged[U] = { type Tag = U }
type @@[T, U] = T with Tagged[U]

class Tagger[U] {
def apply[T](t : T) : T @@ U = t.asInstanceOf[T @@ U]
}
def tag[U] = new Tagger[U]

trait Sorted

现在我想定义一个需要对集合进行排序的方法:

implicit final class RichIndexedSeq[A, CC <: IndexedSeq[A]](val sq: CC) 
extends AnyVal {

/** Nearest percentile (rounded index, no interpolation). */
def percentile(n: Int)(implicit sorted: CC <:< Tagged[Sorted]): A =
sq((sq.size * n - 50) / 100)
}

我更愿意将标签检查保留为隐式证据参数,因为将有其他方法进入没有该约束的 RichIndexedSeq

不过,我肯定做错了什么。我预计这会起作用:

val x = Vector.fill(10)((math.random * 100).toInt)
val y = tag[Sorted](x.sorted)

但事实并非如此:

y.percentile(50)

<console>:44: error: value percentile is not a member of
@@[scala.collection.immutable.Vector[Int],Sorted]
y.percentile(50)
^

问题一定源于扩展方法间接,因为这是有效的:

implicitly[Vector[Int] @@ Sorted <:< Tagged[Sorted]]

最佳答案

implicit final class RichIndexedSeq[A, CC[_] <: IndexedSeq[_]](val sq: CC[A] @@ Sorted)
extends AnyVal {

def percentile(n: Int) =
sq((sq.size * n - 50) / 100)
}

关于scala - 扩展方法中无法识别带有类型标记的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20425902/

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