gpt4 book ai didi

scala - Scala 中的 ADT 子类型化

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

是否存在与 Scala 中使用的 ADT 模式的子类型化 OO 概念等价的概念?
特别是我想为更专业的类型添加方法。例如,给定一个通用列表 ADT:

sealed trait List[+A]
case class Cons[+A](h: A, t: List[A]) extends List[A]
case object Nil[Nothing]

我想为特定类型的列表定义新方法:
sealed trait List[+A]
sealed trait DuckList extends List[Duck] {
def feed(l: DuckList) = ...
}

但是我还必须为这些新类型定义特殊的数据构造函数(DuckCons,DuckNil),并且由于案例类不支持(逐个案例)继承,因此无法将 DuckCons 与泛型相关联缺点是它可以在模式匹配中工作,因此为 List 定义的通用方法不适用于 DuckList。

最佳答案

使用类型类模式。

例如,考虑 Ordering 被实现。它增加了一个方法——compare -- 到一组封闭类,但它不是通过直接添加方法,而是为该特定类提供具有此类方法的实例。 Ordering[Int] ,继续这个例子,是这样实现的:

trait IntOrdering extends Ordering[Int] {
def compare(x: Int, y: Int) =
if (x < y) -1
else if (x == y) 0
else 1
}
implicit object Int extends IntOrdering

即对象 Ordering.Int (因为 this 在对象 Ordering 内)实现了一个方法 compare这需要两个 Int作为参数。该对象是隐式提供的,因此用户不需要显式传递它。 Listsorted方法利用了这一点:
def sorted[B >: A](implicit ord: math.Ordering[B]): List[A]

然后可以调用 ord.compare在列表的实例上对它们进行排序。我鼓励你看看 Ordering了解它在做什么。

关于scala - Scala 中的 ADT 子类型化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19780939/

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