gpt4 book ai didi

scala - 帮助隐含值(value)

转载 作者:行者123 更新时间:2023-12-04 06:27:06 25 4
gpt4 key购买 nike

我有这段代码,它可以工作:

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 的隐式值(当它处于原始形式时),但当我将其拉入实用程序类时却找不到它。

感谢您的帮助,亚历克斯

最佳答案

在原始形式中,没有泛型。 directions 是一个 Seq[SomeWellKnownType],在编译时,编译器在隐式作用域中查找 Ordering[SomeWellKnownType],并找到一个.

另一方面,在 RichSeq[T] 中,编译器必须找到一个隐式 Ordering[T],其中 T 是一个类型范围。没办法这么做。您必须确保在创建 RichSeqOrdering 可用:

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 隐式转换将启动。

关于scala - 帮助隐含值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6859743/

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