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

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(使用前将#替换为@)

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

随机推荐

  • 替换 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