证明匹配类型解析为特定的具体类型

2023-12-02

我正在尝试创建一个使用匹配类型的特征的实现,其中该匹配类型的右侧是预先已知的。但是,我似乎无法让编译器接受我的“证明”。这对我来说很新,如果这真的很明显,我很抱歉。有人可以帮助我了解我是否/如何能够实现我想要的吗?

这是一些最小的代码(Scastie)来说明我在做什么:

class NumberBox {}

class LongBox {}

trait Boxer[T] {
  def box(): Boxer.Box[T]
}

object Boxer {
  type Box[T] = T match
    case Long => LongBox
    case _ => NumberBox
}

case class Val[T](v: T) extends Boxer[T] {
  def box(): Boxer.Box[T] = v match
    case _: Long => new LongBox()
    case _ => new NumberBox()
}

// here we prove that Boxer.Box[T] is a NumberBox
case class NoLongs[T](v: Boxer[T])(using Boxer.Box[T] =:= NumberBox) extends Boxer[T] {
  override def box(): Boxer.Box[T] = new NumberBox()
}

NoLongs(Val(1))

但这失败了:

Found:    NumberBox
Required: Boxer.Box[T]

Note: a match type could not be fully reduced:

  trying to reduce  Boxer.Box[T]
  failed since selector  T
  does not match  case Long => LongBox
  and cannot be shown to be disjoint from it either.
  Therefore, reduction cannot advance to the remaining case

    case _ => NumberBox
    override def box(): Boxer.Box[T] = new NumberBox()

Scala 不会自动按照您寻找的方式应用证明。但你是对的,你确实有证据。事实上,你的证明构成了一个可调用对象:类型=:=[From, To]定义了一个方法叫做apply:

override def apply(f: From): To

现在,你有一个 type 的值Boxer.Box[T] =:= NumberBox, 意思就是apply会转换一个Boxer.Box[T] to a NumberBox。你想要相反的结果:转换 aNumberBox into a Boxer.Box[T]。所以我们需要flip你的证明然后apply it.

def flip: To =:= From

在您的具体用例中,请考虑

case class NoLongs[T](v: Boxer[T])(using eq: Boxer.Box[T] =:= NumberBox) extends Boxer[T] {
  override def box(): Boxer.Box[T] = eq.flip(new NumberBox())
}

我们给证明论证一个名字,eq,然后我们应用它的对称证明(即NumberBox =:= Boxer.Box[T])到我们的NumberBox将其转换为所需的类型。

你也可以只证明NumberBox =:= Boxer.Box[T]直接并摆脱flip,如果需要的话。

case class NoLongs[T](v: Boxer[T])(using eq: NumberBox =:= Boxer.Box[T]) extends Boxer[T] {
  override def box(): Boxer.Box[T] = eq(new NumberBox())
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

证明匹配类型解析为特定的具体类型 的相关文章

  • Spark - Scala - 用另一个数据帧中的查找值替换数据帧中的值

    我正在 Databricks 上使用 Spark 编程语言是Scala 我有两个数据框 主要数据框 见截图 1 https i stack imgur com EShir png 查找数据框 见截图3 https i stack imgur
  • Scalaz 7 Iteratee 处理大型 zip 文件(OutOfMemoryError)

    我正在尝试使用 scalaz iteratee 包在恒定空间中处理大型 zip 文件 我需要对 zip 文件中的每个文件执行一个长时间运行的进程 这些进程可以 并且应该 并行运行 我创建了一个EnumeratorT使每个膨胀ZipEntry
  • 《使用 Apache Flink 进行流处理》如何从 IntelliJ 运行书籍代码?

    如中所述这个帖子 https stackoverflow com questions 61043860 how to run first example of apache flink我无法成功运行 使用 Apache Flink 进行流处
  • scala.collection.breakOut 与视图

    这个答案 https stackoverflow com a 1716558 936869描述如何scala collection breakOut可用于防止创建浪费的中间集合 例如 这里我们创建一个中间体Seq String String
  • 如何在Dotty中使用given?

    我在看Dotty下的文档Contextual Abstractions页面 我看到了Given Instances 给定实例 或者简单地 给定 定义了 规范 值 用于合成给定子句的参数的某些类型 例子 trait Ord T def com
  • Scala:在运行时获取 mixin 接口

    我需要在运行时从给定的类获取所有接口 全部加载在类加载器中 例如 如果一个类是这样声明的 trait B trait C trait D class A extends B with C with D 我想在运行时获取这些信息 A 取决于
  • Spark RDD默认分区数

    版本 Spark 1 6 2 Scala 2 10 我正在执行以下命令spark shell 我试图查看 Spark 默认创建的分区数量 val rdd1 sc parallelize 1 to 10 println rdd1 getNum
  • Scala - 如何解决“值不是 Nothing 的成员”错误

    此示例代码基于 Atmosphere 类 但如果有人可以让我了解该错误的一般含义 我想我可以找出任何特定于 Atmosphere 的解决方案 val bc BroadcasterFactory getDefault lookup broad
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • 如何从 SparkSQL DataFrame 中的 MapType 列获取键和值

    我的镶木地板文件中有数据 该文件有 2 个字段 object id String and alpha Map lt gt 它被读入 SparkSQL 中的数据帧 其架构如下所示 scala gt alphaDF printSchema ro
  • 通用特征的隐式转换

    我正在实现一个数据结构 并希望用户能够使用任何类型作为密钥 只要他提供一个合适的密钥类型来包装它 我有这个关键类型的特质 这个想法是进行从基类型到键类型的隐式转换 反之亦然 实际上 只使用基类型 该特征看起来像这样 trait Key T
  • Scala:类似 Option (Some, None) 但具有三种状态:Some、None、Unknown

    我需要返回值 当有人询问值时 告诉他们以下三件事之一 这是值 没有价值 我们没有关于该值的信息 未知 情况 2 与情况 3 略有不同 示例 val radio car radioType 我们知道该值 返回无线电类型 例如 pioneer
  • 如何捕获 Oozie Spark 输出

    有没有办法捕获spark的输出然后将其输入到shell上 我们当前正在使用 scala 创建 jar 文件 并希望我们的 Spark 输出成为 shell 输入 我的想法是使用 wf actionData spark XXXX var 我只
  • 如何在 Scala 中打印任何内容的列表?

    目前我有一个打印整数的方法 def printList args List Int Unit args foreach println 我如何修改它 使其足够灵活 可以打印任何内容的列表 您不需要专用的方法 所需的功能已经在集合类中 pri
  • 在 Scala 和 SBT 中调试较长的编译时间

    在我的 Scala SBT 项目中 我有一个文件需要 5 分钟才能编译 所有其他的都可以在几秒钟内编译 这使得开发非常痛苦 我确信我滥用了一些 Scala 构造 但我不知道如何调试它 如何在 Scala 中调试较长的编译时间 我正在使用 S
  • Spark Scala 将列从一个数据帧复制到另一个数据帧

    我有一个原始数据框的修改版本 我在其上进行了聚类 现在我想将预测列恢复为原始 DF 索引没问题 因此匹配 我该怎么做 使用这段代码我得到一个错误 println Predicted dfWithOutput show println Ori
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 使用 scala 集合 - CanBuildFrom 麻烦

    我正在尝试编写一个接受任何类型集合的方法CC 并将其映射到一个新的集合 相同的集合类型但不同的元素类型 我正在挣扎 基本上我正在尝试实施map but 不在集合本身上 问题 我正在尝试实现一个带有签名的方法 它看起来有点像 def map
  • Scala 中的 Shapeless 结构编程:如何正确使用 SYB 实现?

    我想使用SYB http research microsoft com en us um people simonpj papers hmap 实施于无形图书馆 https github com milessabin shapeless编写
  • Scala 解析器组合器的运算符优先级

    我正在研究需要考虑运算符优先级的解析逻辑 我的需求并不太复杂 首先 我需要乘法和除法比加法和减法具有更高的优先级 例如 1 2 3 应视为 1 2 3 这是一个简单的例子 但你明白了 我需要将更多自定义标记添加到优先级逻辑中 我可以根据此处

随机推荐

  • 替换 pandas 数据框中的括号[重复]

    这个问题在这里已经有答案了 我使用了下面的代码 input table input table replace to replace value 替换整个数据框中的括号 但令我惊讶的是 它不起作用 可能出了什么问题 Need regex T
  • Froogaloop2 库/API 是否仍受支持?

    在过去的几天里 我开始在我们的两个网站上播放视频 vimeo 视频 时遇到问题 我使用 Froogaloop2 API 库 突然间我无法搜索和播放视频 视频就停滞了 Froogaloop2 库最近发生了什么事吗 它仍然受支持吗 Thanks
  • 获取当前位置的国家/地区和时间戳

    我想知道我的应用程序在哪里使用 这是获取国家 地区名称的代码 public string Country RegionInfo CurrentRegion DisplayName 这是获取时区的代码 public void TimeStam
  • H264视频起始码的使用

    我对 H264 视频的起始代码 0x00 0x00 0x00 0x01 的使用有一般性问题 我不清楚这个起始代码的用法 因为在与 H264 视频相关的 RTP RFC 中没有参考 但我确实在网上看到了很多参考资料 特别是在 stackove
  • 预测 sprintf( ) 行的长度?

    是否有一个函数可以用来预测 sprintf 需要的空间 IOW 我可以调用函数 size t Predict space s n some string 来返回 sprintf s n some string 结果的 C 字符串的长度吗 I
  • 旋转 matplotlib 颜色图

    The ProPlotPython 包向 Matplotlib 库添加了附加功能 包括颜色图操作 对我来说特别有吸引力的一项功能是旋转 移动色彩图的能力 举个例子 import proplot as pplot import matplot
  • UI 到 HTML,转换不会将日期写入工作表

    我正在尝试复制 Pieter Jaspers 提出的关于将表单从 UIApp 转换为 HTML 的问题 原来的问题是 Pieter Jaspars 提出的原始问题由 Sandy Good 回答 如果我完全复制代码 我会得到正确的结果 但是当
  • Android:NPE,同时尝试使用 ACTION_APPWIDGET_PICK 意图的 ActivityForResult

    我有一个问题然后试图表达意图AppWidgetManager ACTION APPWIDGET PICK正如我从日志中看到的那样 Android AppWidget 生态系统内部存在问题 那我做错了吗 请参阅下面的示例代码和堆栈跟踪 pub
  • Django 服务器代码未更新

    我的服务器上正在运行一个广泛的程序 出现错误的行如下所示 result 0 update dictionary result 0 好像 label key value 所以我收到一个错误说tuple不具有update 当我把它固定为resu
  • C语言中如何找出最接近某个数的值?

    我在 C 中有以下代码 define CONST 1200 int a 900 int b 1050 int c 1400 if A CLOSEST TO CONST do something 检查 a 是否是 a b 和 c 中最接近 C
  • 使用 VSTS 任务将 UWP 应用程序分发到应用程序中心(又名移动中心)

    我目前正在与 Microsoft 合作解决您的一个 UWP 应用程序在启动后崩溃的案例 经过对 msbuild 的大量调试后 我认识到只有当生成的 appxbundle 文件通过 Microsoft App Center 又名移动中心 分发
  • D3js SVG 打开线条显示填充伪影,如何修复?

    I just added French rivers lines to my D3js generated SVG It now display a result like 我需要在没有神器的情况下保持河流线 数据 由弧组成的 topojs
  • Powerpoint编辑如何将一个形状从一张幻灯片复制到另一张幻灯片

    我是 C 编程的新手 我只是对整个 MS Office 库感到困惑 我想从幻灯片 3 中复制文本框并将其粘贴到幻灯片 2 中 我按照找到的页面中的说明进行操作 如何在 C 中将形状从一张幻灯片复制到另一张幻灯片 presentation S
  • libz.so.1:无法打开共享对象文件

    我在 ubuntu 12 04 上遇到一个问题 usr lib ndk android ndk r8c toolchains arm linux androideabi 4 6 prebuilt linux x86 bin lib gcc
  • 将数据从服务传递到组件 --> 子组件

    简而言之 我正在使用这个Plunker我有一个场景 我必须通过从服务读取元素数据来动态创建控件 因此 当我从服务读取数据时 它是异步的 但是我必须根据从服务接收的数据创建一些具体对象并将其传递给子组件 所以这是我的逻辑 主要组件的 Html
  • 动态添加视图到Horizo​​ntal LinearLayout 超出屏幕

    我必须动态创建文本视图和编辑文本 并将其插入已在 XML 文件中声明的线性布局 水平 内 要插入的文本视图和编辑文本的数量动态变化 我正在动态创建视图并将其添加到线性布局中 但问题是 如果视图数量更多 它会移出屏幕 尽管进入下一行 我应该做
  • 使用 QComboBox 选择显示的不同小部件集

    我正在开发一个左侧有工具栏的图像查看器 由于我有很多措施要做 但希望将大部分显示用于图片并保持工具栏较薄 所以我想使用combo box1 and combo box2选择工具栏中显示的不同小部件 示例1 如果我选择measurements
  • 使用 PDO 获取 MySQL 服务器版本

    我正在 Laravel 5 中构建一个应用程序 我需要确保我的一个表能够执行全文搜索 我想检测 MySQL 版本号 确保它至少为 5 6 10 或更高版本 以便如果该条件失败 我可以在给定表的迁移文件中将引擎切换到 MyISAM 我似乎找不
  • php/Ajax - 预加载图像的最佳实践

    我编写了一个非常类似于 flickr 照片流功能的脚本 两个缩略图彼此相邻 当您单击下一个或上一个链接时 下一个 或上一个 图像会滑入 酷 目前 当页面加载时 它会加载两个图像 第一次使用 nxt prv 时 接下来的两个图像或前两个图像将
  • 证明匹配类型解析为特定的具体类型

    我正在尝试创建一个使用匹配类型的特征的实现 其中该匹配类型的右侧是预先已知的 但是 我似乎无法让编译器接受我的 证明 这对我来说很新 如果这真的很明显 我很抱歉 有人可以帮助我了解我是否 如何能够实现我想要的吗 这是一些最小的代码 Scas