gpt4 book ai didi

Scala 排序、有序和 View 绑定(bind)

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

我正在编写以下代码来说明问题:

def max[T <% Ordered[T]](a: T, b: T) = {
val c = a.compare(b)
if (c > 0) a else b
}

def min[T <% Ordering[T]](a: T, b: T) = {
val ord = implicitly[Ordering[T]]
val c = ord.compare(a, b)
if (c > 0) b else a
}

println(s"max is ${max(10, 20)}")
implicit val intOrdering = new Ordering[Int] {
override def compare(x: Int, y: Int): Int = x - y
}
println(s"min is ${min(10, 20)}")
max方法效果很好,而 min方法不行,提示 No implicit Ordering defined for T即使我定义了 intOrdering ,它仍然提示。

我会问为什么 Ordered有效,但 Ordering不在这里,即使我已经为 Ordering[Int] 提供了隐式定义

最佳答案

OrderedOrdering在语义上是不同的。一个 Ordered[T]是一个支持与其他 Ordered[T] 进行比较的对象s,而 Ordering[T]是单个对象,它是能够比较普通 T 的函数的集合s。

这种差异反射(reflect)在您需要在此处使用的两种类型的边界上。 View 绑定(bind)[T <% Ordered[T]]意味着需要有一个隐式函数T => Ordered[T]范围内的某处。这个函数是隐式转换intWrapper(Int): RichInt .这些RichInt s 直接支持通过比较方法进行自身之间的比较。

但是,def min[T <% Ordering[T]]...不能工作。这需要一个 T => Ordering[T] ,或从一个类型的值到该类型的排序的函数。对于某些类型,这可能存在,但对于大多数类型,如 Int ,它不会。

另一种绑定(bind)是上下文绑定(bind),T: Ordering ,这是您必须在 min 中使用的内容.这种形式的上下文绑定(bind)请求隐式 Ordering[T] ,即def min[T: Ordering](a: T, b: T)需要两个 T s 作为参数,还有一个隐含的 Ordering[T]这定义了它们的排序方式。

在数学语言中: View 绑定(bind)的形式为 Left <% Right对于某些类型 LeftRight实物* ,导致创建 Left => Right 类型的隐式参数.上下文绑定(bind)的形式为 Left: Right对于某些类型Left某种k和一些类型Right实物k -> * ,导致创建 Right[Left] 类型的隐式参数.

关于Scala 排序、有序和 View 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44793262/

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