我正在嘗試製作一個可與其他序列比較的序列(例如,其他集合類型也是可行的)。Seq [A]擴展順序[Seq [A]]
class RichSeq[A](val seq: Seq[A]) extends Ordered[RichSeq[A]]
當然有在refered包對象中的隱式轉換:
implicit def seq2RichSeq[A](s: Seq[A]) = new RichSeq(s)
比較裝置,第一尺寸比事項每個元素。代碼清楚:
class RichSeq[A](val seq: Seq[A]) extends Ordered[RichSeq[A]] {
def compare(s: RichSeq[A]) = {
seq.size compare s.seq.size match {
case 0 => seq.view.zip(s.seq).map { case (x,y) => ord.compare(x,y) }.dropWhile(_ == 0).headOption.getOrElse(0)
case x => x
}
}
}
但是,這不`噸編譯(當然),因爲一個需要排序的元素比較,所以我試過了:
class RichSeq[A](val seq: Seq[A]) extends Ordered[RichSeq[A]] {
def compare(s: RichSeq[A])(implicit ord: Ordering[A]) = {
// ...
}
}
現在的簽名比較方法是不適合的,所以我提出的隱式ord
到類簽名(並且適於隱式轉換):
implicit def seq2RichSeq[A](s: Seq[A])(implicit ord: Ordering[A]) = new RichSeq(s)
class RichSeq[A](val seq: Seq[A])(implicit ord: Ordering[A]) extends Ordered[RichSeq[A]] {
def compare(s: RichSeq[A]) = {
// ...
}
}
但現在我有一個問題,即在的所有其它方法,我想通過implicit
在Seq[A]
使用也需要一個隱含的Ordering[A]
,我不能總是提供一個。有時候我使用我的RichSeq
通過沒有排序的方法和有時使用比較方法。
例如,有時我叫
def distinctBy[B](f: A => B): Seq[A] = {
seq.foldLeft { (Buffer[A](),MutMap[B,A]()) } {
case ((b,m),x) if m contains f(x) => (b,m)
case ((b,m),x) =>
m += f(x) -> x
b += x
(b,m)
}._1
}
同時我不能定義一個Ordering[A]
。
我看到有兩個不同的類(有兩個隱式轉換)一個解決辦法:
class RichSeqOrderable[A](val seq: Seq[A])(implicit ord: Ordering[A]) extends Ordered[RichSeqOrderable[A]]
class RichSeq[A](val seq: Seq[A])
但我認爲,打破讓所有的東西在一起的念頭?!?
我會去兩個班,但在同一個文件。 – Anonymous 2011-03-11 18:00:17
http://stackoverflow.com/questions/4493242/why-dont-scala-lists-have-an-ordering – 2011-03-11 21:20:38