Scala 中具有抽象类型的 F 界多态性

2023-12-28

我读过几篇文章,表达了应该使用抽象类型来实现 Scala 中的 f 有界多态性。这主要是为了缓解类型推断问题,同时也是为了消除定义递归类型时类型参数似乎引入的二次增长。

这些定义如下:

trait EventSourced[E] {
  self =>

  type FBound <: EventSourced[E] { type FBound <: self.FBound }

  def apply(event: E): FBound
}

然而,这似乎引入了两个问题:

1) 每次用户想要引用该类型的对象时,他们还必须引用FBound类型参数。这感觉就像代码味道:

def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...

2) 编译器现在无法推断上述方法的类型参数,失败并显示消息:

Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound

是否有人在其解决方案中成功实现了 f 有界多态性,从而编译器仍然能够推断类型?


从那时起,我意识到在大多数情况下应该避免 f 有界多态性 - 或者更确切地说 - 通常您应该选择另一种设计。要了解如何避免它,我们首先需要知道是什么让我们需要它:

当类型期望时,就会发生 F 有界多态性重要的界面变化在派生类型中引入。

这是通过以下方式避免的构成预期的变化领域,而不是试图通过继承来支持它们。这实际上又回到了四人帮设计模式:

优先选择“对象组合”而不是“类继承”

——(四人帮,1995)

例如:

trait Vehicle[V <: Vehicle[V, W], W] {
    def replaceWheels(wheels: W): V
}

becomes:

trait Vehicle[T, W] {
    val vehicleType: T
    def replaceWheels(wheels: W): Vehicle[T, W]
}

这里,“预期变化”是车辆类型(例如Bike, Car, Lorry)。前面的示例假设这将通过继承添加,需要一个 f-bounded 类型来推断W使用车辆不可能实现任何功能。使用组合的新方法不会出现这个问题。

See: https://github.com/ljwagerfield/scala-type-in​​ference/blob/master/README.md#avoiding-f-bounded-polymorphism https://github.com/ljwagerfield/scala-type-inference/blob/master/README.md#avoiding-f-bounded-polymorphism

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中具有抽象类型的 F 界多态性 的相关文章

随机推荐

  • 套接字上的 ClamAV clamd INSTREAM 出现间歇性问题

    我有一个运行 NodeJS 代码的 AWS Lambda 函数 用于将文件从 S3 流式传输到在 EC2 实例上运行的 ClamAV 一般来说 大约 75 的时间 系统可以正常工作 但经常 特别是当从不同的 Lambda 容器扫描多个文件时
  • Scala:谁能解释一下?

    考虑以下 Scala 代码 case class Data T value Option T def get T try doGet catch case e Exception gt throw new IllegalArgumentEx
  • Kotlin 中的按钮数组

    如何在 Kotlin 的 android studio 中创建按钮数组 我已经在 xml 文件中创建了带有 id 的按钮 现在我想在 Kotlin 代码中使用与数组元素相同的按钮 我尝试过这样的事情 var buttons Array
  • 有人在 R 中实现 Eureqa 接口吗?

    好吧 这个问题并不完全是技术性的 但非常相关且当前 如果您可能还没有听说过 Eureqa http creativemachines cornell edu eureqa 是一种基于机器学习 的工具 可帮助您找到数据中隐藏的方程和数学关系
  • Hibernate中的“删除哪里”级联删除?

    我正在尝试通过其外键之一级联删除连接表中的行 并且它有另一个与其相关的表 我也想删除与此 ID 关联的所有行 所以看起来如下图所示 当我将 Session delete reqCandObject 与 hibernate 一起使用时 它工作
  • 持久化自定义对象

    我有一个简单地继承自 NSObject 的自定义对象 它有 3 个成员 两个花车和一个NSDate 我的应用程序将有一个数组 其中包含许多这些对象 并且我需要在运行之间保留它 我怎样才能做到这一点 我考虑过使用 SQLite 数据库 但我认
  • 控制台和文件上的 Python 输出

    我正在编写一个代码来分析 PDF 文件 我想在控制台上显示输出 并在文件中保存输出的副本 我使用以下代码将输出保存在文件中 import sys sys stdout open C users Suleiman JK Desktop fil
  • 如何在 PostgreSQL 函数中使用 COMMIT 和 ROLLBACK

    我正在使用三个插入语句 如果第三个语句有错误 我想回滚第一个和第二个语句 如果没有办法做到这一点 请告诉我在 PostgresqQL 中处理此问题的不同方法 如果我使用COMMIT or ROLLBACK 我收到错误 CREATE OR R
  • jsp:param 与 Java 类

    我有一个 JSP 文件 其中包含另一个 JSP 文件 第一个 JSP 应该将 Java 类 小部件 的实例传递给第二个 JSP 文件 这就是我所拥有的 第一个 JSP
  • Scala tailrec注释错误

    我有一个名为的 Java 抽象类ImmutableEntity以及几个包含类级注释的子类 DBTable 我正在尝试使用尾递归 Scala 方法在类层次结构中搜索注释 def getDbTableForClass A lt Immutabl
  • 在 Swift 中用数组序列化我自己的对象有什么更优雅的方法

    我有一个看起来像这样的课程 class Foo var bar Int class Bar var baz String var arr Foo 我有一个 Bar 结构的对象 我需要将其序列化为 JSON let instance Bar
  • 将主题更改为“NoActionBar”后应用程序崩溃

    您好 我必须将我的应用程序主题更改为 Theme AppCompat Light NoActionBar 但我更改后 应用程序崩溃了 我找不到问题出在哪里 我的目标是在工具栏上扩展我的导航抽屉 但为此 我需要 NoActionBar 函数
  • 函数 NSE 内的 group_by dplyr

    我使用时遇到问题dplyr and group by在管道函数调用中 可重现的示例 使用以下数据 ex data lt structure list word1 c no not not no not not not not no not
  • 使用自定义 ExecutionContext 执行 Future.sequence

    我正在尝试创建一个Future List Int from a List Future Int 使用指定的ExecutionContext 但是 我收到有关类型为 cbf 的第二个隐式参数的错误CanBuildFrom 我不完全理解其目的C
  • TypeScript 错误 Web 必备

    我使用 Web Essentials 在保存时编译我的打字稿文件 Visual Studio 2012 但我得到一个空的 js 和以下消息 Compile Error See error list for details error TS5
  • 禁用点击事件处理程序一段时间

    我已经看过类似的问题 但提供的答案涉及按钮而不是 div 元素 当我单击带有 id 的 div 元素时click 单击事件处理程序被禁用unbind 并设置一个 2 秒的计时器 2 秒后 应再次启用单击事件处理程序bind 问题是单击事件处
  • 如何在 python 中查找常规 3D 网格上的相邻线

    我有一堆点的坐标 想在 python 包中用它们创建曲面 我想在将数据导入包之前对其进行整理 点来自规则网格 首先 我根据点的位置创建线 在此步骤中 我仅定义哪些点号创建我的线 我的输入数据是 coord np array 0 0 2 0
  • 将旧的 makefile 转换为 CMake

    我正在尝试将旧的 makefile 代码转换为 CMake 你能帮助我吗 这是我目前陷入困境的部分 我不知道如何将这些参数传递给编译器 COMPILE FLAGS c m32 O3 fPIC w DSOMETHING Wall I src
  • Addthis 不适用于 Ajax

    我正在使用 Ajax 加载所有文章 但 Addthis 功能不正确 thisChild load permLink thePostStuff function 在所述 load 函数的回调中 我添加了以下代码以引入 Addthis 共享功能
  • Scala 中具有抽象类型的 F 界多态性

    我读过几篇文章 表达了应该使用抽象类型来实现 Scala 中的 f 有界多态性 这主要是为了缓解类型推断问题 同时也是为了消除定义递归类型时类型参数似乎引入的二次增长 这些定义如下 trait EventSourced E self gt