gpt4 book ai didi

scala - Dotty 类型类的扩展与中缀特征方法

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

我浏览了 documentation并找到了几种如何为类型类实例定义临时行为的方法。这是原始示例:

trait Ord[T] {
def compare(x: T, y: T): Int
extension (x: T) def < (y: T) = compare(x, y) < 0
extension (x: T) def > (y: T) = compare(x, y) > 0
}

有趣的是我们可以定义一堆普通的中缀方法和扩展。用户预期的行为应该是相同的(尽管实现不同)。

trait RankEq[T]:
extension (x: T)
def equal (y: T): Boolean

extension (x: T)
def notEqual (y: T): Boolean = !rankEqual(y)

trait RankOrd[T] {
def rankCompare(x: T, y: T): Int

def (x: T) isLower (y: T): Boolean =
rankCompare(x, y) == -1

def (x: T) isHigher (y: T): Boolean =
rankCompare(x, y) == 1
}

这是说明这一点的例子:

given rankEq as RankEq[Rank] {
extension (x: Rank)
def equal (y: Rank) = (x.ordinal - y.ordinal) == 0
}

given rankOrd as RankOrd[Rank] {
override def rankCompare(x: Rank, y: Rank): Int = {
x.ordinal - y.ordinal
}
}

object Rank {
def beats(r1: Rank, r2: Rank)
(using RankEq[Rank])(using RankOrd[Rank]): Boolean = {

if r1.equal(r2) then false // extension methods
else r1.isHigher(r2) // trait-member infix method
}
}

由于这两种构造都在做同样的事情(以不同的方式),因此出现了一个问题:哪种方式最惯用?如果两者兼而有之,各自在哪种情况下效果最好?

谢谢!

最佳答案

if r1.equal(r2) then false    // extension methods
else r1.isHigher(r2) // trait-member infix method

其实,

trait RankOrd[T] {
def (x: T) isHigher (y: T): Boolean
}

是扩展方法的前一种语法

trait RankEq[T] {
extension (x: T) def equal (y: T): Boolean
}

current extension methods 的语法.

所以“trait-member infix methods”是用前一种语法编写的扩展方法。

查看提交

https://github.com/lampepfl/dotty/commit/6ff0ac8694d4e3b84ed9b15fb277f429c6767faa

我想目前支持的两种语法都是暂时的。

关于scala - Dotty 类型类的扩展与中缀特征方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64037420/

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