具有类型成员的 Case 对象的模式匹配

2024-02-19

Scala 有一个很好的功能来推断模式匹配中的类型参数。它还检查模式匹配的详尽性。例如:

sealed trait PField[T]

case object PField1 extends PField[String]

case object PField2 extends PField[Int]

def getValue[X](f: PField[X]): X = f match {
  case PField1 => "aaa"
  case PField2 => 123
}

是否可以实现相同的目标,但使用类型成员而不是类型参数?

sealed trait Field {
  type T
}

case object Field1 extends Field {
  type T = String
}

case object Field2 extends Field {
  type T = Int
}

以下解决方案不起作用(在 Scala 2.12.6 中测试):

//No exhaustiveness check
def getValue[X](f: Field {type T = X}): X = f match {
  case Field1 => "aaa"
  //    case Field2 => 123
}

//casting needed
def getValue2[X](f: Field {type T = X}): X = (f: Field) match {
  case Field1 => "aaa".asInstanceOf[X]
  case Field2 => 123.asInstanceOf[X]
}

type Generified[X] = Field {type T = X}

//No exhaustiveness check
def getValue3[X](f: Generified[X]): X = f match {
  case Field1 => "aaa"
  //    case Field2 => 123
}

在我的例子中,类型参数确实是有问题的,因为我有许多字段的子层次结构,并且每个层次结构都有一些类型类。我无法将所有需要的依赖项放入案例对象中,因为它们是在一个瘦 JAR 中导出到客户端的。


该解决方案是@Andrey Tyukin 发布的解决方案的简化版本。 他表示

对于 Field3 类型的任何两个值 a、b,它不成立 a.T = b.T。

这意味着,要进行详尽的模式匹配,必须忽略类型成员。因此,为了兼具详尽性和类型推断,我们需要带有类型参数的密封层次结构。

他建议创建单独的案例类层次结构,并在它们上而不是在主层次结构上进行模式匹配。然而,就我而言,它可以简化:我创建了带有类型参数的新密封特征,但相同的情况对象用于模式匹配(“唯一保证”保存在对象本身中)。这是最终的解决方案:

sealed trait Field {
  type T
  def ug: TField[T]
}

sealed trait TField[G] extends Field {
  type T = G
  def ug: TField[T] = this
}

case object Field1 extends TField[String]
case object Field2 extends TField[Int]

def getValue[X](f: Field {type T = X}): X = (f.ug: TField[X]) match {
  case Field1 => "abc"
  case Field2 => 123
}

多亏了我可以使用Field特征来定义类型类,而无需进入更高种类的类型并切换到TField[G]用于模式匹配。

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

具有类型成员的 Case 对象的模式匹配 的相关文章

  • 我可以让 C 函数返回任意类型吗?

    我编写了一个解释串行数据 CAN 的函数 当前返回一个浮点数 我希望该函数包含一个参数 其中用户在字符串中指定返回类型 并且该函数返回该类型的值 这只是一个方便的事情 以避免编写共享几乎所有相同代码的多个函数 将 void 指针传递给您想要
  • 通用列表 FindAll() 与 foreach

    我正在浏览通用列表以查找基于特定参数的项目 一般来说 最好和最快的实施是什么 1 循环遍历列表中的每个项目并将每个匹配项保存到新列表中并返回 foreach string s in list if s match newList Add s
  • Java 泛型:通配符

    因此 我正在阅读泛型以重新熟悉这些概念 特别是在涉及通配符的情况下 因为我几乎从未使用过它们或遇到过它们 从我读过的内容来看 我无法理解他们为什么使用通配符 我经常遇到的例子之一如下 void printCollection Collect
  • 为什么调用 take() 方法时 Slick 会生成子查询

    I use Slick http slick typesafe com 1 0 0 RC1 我对表对象有这样的定义 object ProductTable extends Table Int String String String Dou
  • Scala:在运行时获取 mixin 接口

    我需要在运行时从给定的类获取所有接口 全部加载在类加载器中 例如 如果一个类是这样声明的 trait B trait C trait D class A extends B with C with D 我想在运行时获取这些信息 A 取决于
  • 如何使用可以是多种类型的变量?

    我经常使用以下方法将对象链接到其父对象 Video parent 有时我的对象可以是不同对象类型的子对象 我也是如此 int parentType Video parentVideo if parent VIDEO then this wi
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 对于空列表,max() 应该返回什么?

    Got java util NoSuchElementException head of empty list所以我试着检查一下 但现在我明白了 info max of a few numbers FAILED info 0 did not
  • Java / Scala Future 由回调驱动

    简洁版本 我怎样才能创建一个Promise
  • 为什么此代码会失败并显示 sourceCompatibility=1.8 [重复]

    这个问题在这里已经有答案了 以下代码在使用 sourceCompatibility 1 7 或 1 6 编译时有效 但在切换到 1 8 后失败 public class Java8Wat interface Parcelable stati
  • '&&x' 模式匹配是否会导致 x 被复制?

    在文档中std iter 迭代器 filter https doc rust lang org stable std iter trait Iterator html method filter它解释了值通过引用传递给闭包 并且由于许多迭代
  • 在 Java 6 的右侧使用泛型?

    我的java 6我可以声明数组列表如下 方式1 使用泛型 即
  • 如何从 SparkSQL DataFrame 中的 MapType 列获取键和值

    我的镶木地板文件中有数据 该文件有 2 个字段 object id String and alpha Map lt gt 它被读入 SparkSQL 中的数据帧 其架构如下所示 scala gt alphaDF printSchema ro
  • java中获取HashMap中的变量类型

    我有一个HashMap
  • 限制类型安全异构容器中的键

    我想使用 Joshua Bloch 的 Effective Java 中描述的泛型类型安全容器模式 但想通过使用枚举来限制可用作键的类 以下是约书亚书中的代码 public class Favorites private Map
  • 非严格的多接口类型参数约束?

    对不起 如果这是一个骗局 但我似乎无法获得正确的关键字组合来过滤各种类型约束和泛型问题 因为有很多 我有两个接口 我们称它们为IOnline and IOffline 它们密切相关 因为它们描述了几乎相同的合约 但它们之间的主要区别之一是使
  • Scala:类似 Option (Some, None) 但具有三种状态:Some、None、Unknown

    我需要返回值 当有人询问值时 告诉他们以下三件事之一 这是值 没有价值 我们没有关于该值的信息 未知 情况 2 与情况 3 略有不同 示例 val radio car radioType 我们知道该值 返回无线电类型 例如 pioneer
  • 如何在 Scala 中打印任何内容的列表?

    目前我有一个打印整数的方法 def printList args List Int Unit args foreach println 我如何修改它 使其足够灵活 可以打印任何内容的列表 您不需要专用的方法 所需的功能已经在集合类中 pri
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • 在 Spring xml 配置中创建 Guava TypeToken?

    我希望能够注射Guava 类型令牌 http docs guava libraries googlecode com git javadoc com google common reflect TypeToken html对象通过在 Spr

随机推荐

  • 衡量代码质量时的代码行 VS 指令

    我有一个由许多模块组成的项目 我正在运行两者JaCoCo http www eclemma org jacoco 对于单元测试覆盖率和Sonar https www sonarqube org 为了代码质量 由于技术原因 我无法对我的模块之
  • Java:在实例化期间传递“this”的实例[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的班级1 public class myClass1 public myClass2 myclass2 public void cr
  • 为什么有些 Python 变量保持全局,而有些需要定义为全局

    我在理解为什么有些变量是局部变量而有些变量是全局变量时遇到了一些困难 例如 当我尝试这个时 from random import randint score 0 choice index map a 0 b 1 c 2 d 3 questi
  • 何时调用 Thread.currentThread().interrupt() 何时不调用?

    从互联网上的多篇文章来看 建议不要吞咽InterruptedException 当我要重用同一个线程时 使用类似这样的线程池执行器来执行此操作更有意义 public static void main String args throws I
  • SQL LIKE % 对于整数

    在 T SQL 中 如何编写查询来为列的任何整数值选择行 比如数据是这样的 NAME AGE A 10 B 20 C 10 D 20 并且有一个
  • 根据控件宽度缩放 UISegmentedControl 标签

    这似乎是理所当然的 但我找不到任何方法来做到这一点 基本上我拥有的是UISegmentedControl带有两个本地化标签NSLocalizedString 我已经设置了字体大小 并且所有内容在英语和其他几种语言中看起来都很棒 但是 在日语
  • 位置:Flash 上的绝对 div

    是否有可能position absolute a div div 在 Flash 横幅上 无需添加wmode transparent 到横幅 我有一个灯箱需要显示在我的广告上方 但我无法直接修改横幅 因为它们来自第三方 Edit 问题主要出
  • 如何从 std::list 实现 O(1) 擦除

    问题是推荐的使用方式是什么std list实现 O 1 删除列表项 通常 当我选择双向链表时 我希望能够在 O 1 时间内从列表中删除一个元素 然后在 O 1 时间内将其移动到不同的列表 如果该元素有自己的prev and next指针 没
  • 是否有低级网络库来嗅探和更改网络流量? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种嗅探网络数据包并用 C 对其进行编码的方法 总之 改变网络流量 我不知道如何解释我的请求
  • android viewpager with tablayout - 如何在选项卡内添加其他片段?

    so i have the classic viewpager in a tablayout that looks something like this 我的 viewPagerAdapter 类如下所示 公共类 HomePagerAda
  • 在 onreadystatechange 函数中访问类变量时出现 Ajax 类错误

    我目前正在编写 JavaScript Ajax 类并遇到错误 在函数 processRawData 中 我似乎无法使用 this xhr 访问类变量 xhr 我得到 无法读取未定义的readyState属性 我目前已经通过在设置对onrea
  • 为什么水平边距不像垂直边距那样折叠?

    我明白为什么边距塌陷发生 我在不同的网站上看到了一些关于它是如何发生以及为什么会发生的例子 再具体一点 margin on CSS 技巧 https css tricks com almanac properties m margin 是我
  • Singleton 不在 Cython 中工作

    这就是我定义单例的方式 class Singleton type instances def call cls args kwargs if cls not in cls instances cls instances cls super
  • 如何翻译身份密码验证消息

    到目前为止 我已经能够翻译 ASP Net Core 2 1 Web 应用程序中的所有内容 事实证明 这是一个小小的挑战 因为搭建的帐户页面需要一些设置 但我找不到翻译密码验证消息的方法 另外 翻译模型绑定消息是一个小挑战 感谢 stack
  • 标准机器学习语法

    我是标准机器学习的新手 并尝试编写以下代码 fun whilestat test stmt1 fn x gt if test x then stmt1 x whilestat test stmt1 else x 问题是它给了我以下错误 w
  • 动态翻译/使用 i18next 进行变量翻译

    为什么我不能动态翻译 在 i18next 中使用变量 例如在我的 JS 文件中我得到了这个 这里我使用一个变量并将其分配给 i18n 函数 但它不起作用 this does not work var dynamicTranslation m
  • 允许用户在 WPF 中调整 Expander 的大小

    我有丰富的 C 和 WinForms 经验 但我是 WPF 的新手 我有一个带有向下扩展的扩展器的窗口 就像我当前输入的问题框一样 我希望用户能够通过单击底部的字形 如这个问题框 并将扩展器拖动到所需的大小来动态调整扩展器的大小 谁能提供
  • 在 Flask 中执行耗时函数时显示“正在加载”消息

    我对 Flask 还比较陌生 总体来说还是一个网络菜鸟 但到目前为止我已经取得了一些不错的结果 现在我有一个表单 用户可以在其中输入查询 该查询被提供给一个函数 该函数可能需要 5 到 30 秒的时间才能返回结果 使用 Freebase A
  • Angular 2动态更改ngTemplateOutlet中的模板

    我想动态更改 ngTemplateOutlet 中的模板 当 selectedTab 更改时 ngTemplateOutlet 也会更改 我下面有两个基本模板 称为 Tab1 和 Tab2 Note 我使用的是 Angular 版本 4 选
  • 具有类型成员的 Case 对象的模式匹配

    Scala 有一个很好的功能来推断模式匹配中的类型参数 它还检查模式匹配的详尽性 例如 sealed trait PField T case object PField1 extends PField String case object