帮助隐含价值

时间:2011-07-28 13:29:48

标签: scala implicit

我有一些代码,它有效:

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的隐含值,当它是原始形式时,但是一旦我将它拉入实用程序类就找不到它。

感谢您的帮助, 亚历

1 个答案:

答案 0 :(得分:6)

在原始形式中,您没有任何泛型。 directionsSeq[SomeWellKnownType],在编译时,编译器在隐式作用域中查找Ordering[SomeWellKnownType],并找到一个。{/ p>

另一方面,在RichSeq[T]中,编译器必须找到隐式Ordering[T],其中T是一个类型参数。没办法那样做。您必须确保在创建Ordering

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

有一个快捷方式,特别是如果你只需要隐式范围内的ev而不明确地重新显示它,就像在这里:

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

然后你在隐式方法中遇到完全相同的问题,这也是通用的,使用相同的解决方案:

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

然后它应该工作。当序列可用于Seq中元素的类型时,seq2richSeq隐式转换将启动。