2011-07-28 92 views
2

我有這段代碼,它的工作原理:幫助的隱含價值

val directions = rs.map(_.direction) // Direction extends Enumeration 
directions == directions.sorted.reverse 

我想,而不是做這樣的事情:

ratings.map(_.direction).isInBackwardsOrder 


class RichSeq[T](seq: Seq[T]) { 
    def isInBackwardsOrder = seq == seq.sorted.reverse 
} 

object RichSeq { 
    implicit def seq2richSeq[T](seq: Seq[T]) = new RichSeq[T](seq) 
} 

我不斷收到以下編譯錯誤:

could not find implicit value for parameter ord: Ordering[T] 
def isInBackwardsOrder = seq == seq.sorted.reverse 

我不明白的是爲什麼它可以找到參數ORD,當它在原始形式的隱性價值,但不能一旦我把它變成一個實用類,就會發現它。

感謝您的幫助, 亞歷

回答

6

在原來的形式,你沒有仿製藥。 directionsSeq[SomeWellKnownType],在編譯時,編譯器在隱式範圍內查找Ordering[SomeWellKnownType],並找到一個。

另一方面,在RichSeq[T]中,編譯器必須找到隱含的Ordering[T],其中T是一個類型參數。沒辦法做到這一點。你必須確保在創建Ordering將可在RichSeq

class RichSeq[T](seq: Seq[T])(implicit ev: Ordering[T]) {... 

沒有爲一個快捷方式,特別是如果你只需要ev中隱含的範圍沒有明確refrencing它,在這裏:

class RichSeq[T : Ordering](seq: Seq[T]) {... 

然後,你必須在你的隱式方法,這是通用的也有相同的解決方案完全一樣的問題:

implicit def seq2richSeq[T: Ordering](seq: Seq[T]) = new RichSeq[T](seq) 

然後它應該工作。當Ordering可用於Seq中元素的類型時,隱式轉換將啓動。

+0

當我將其更改爲[T:排序]時,我仍然遇到同樣的問題,早期的 –

+0

對我來說工作正常。你有什麼錯誤,在哪裏? –

+0

這工作。在幕後,假設枚舉類型是'Direction',編譯器會查找一個不是衆所周知的類型的Ordering [Direction.Value],但是使用隱式的'Ordering.ordered [A]'它召喚一個需要。因此,Typer階段後的結果代碼看起來像是'seq2richSeq(directions)(Ordering.ordered [Direction.Value](Predef.conforms [Direction.Value]))。isInBackwardsOrder'。令人驚歎的... – huynhjl