一般重写 Scala 案例类

2024-05-05

是否可以通用地替换案例类中的参数?更具体地说,假设我想要一个接收“查找”案例类和“替换”案例类(如语法规则的左侧和右侧)以及目标案例类的替代函数,并且该函数将返回将查找案例类的参数替换为替换案例类的新案例类?该函数还可以简单地采用一个案例类(产品?)和一个应用于该案例类的所有参数/产品的函数。

显然,给定一个特定的案例类,我可以使用 unapply 和 apply - 但是一般(给定任何案例类)编写此类函数的最佳/最简单/等方法是什么?

我想知道是否有一个使用 Scala 2.10 反射功能或来自 shapeless 的 Iso.hlist 的好的解决方案。

例如,我真正想要做的是,给定如下所示的类......

class Op[T]
case class From(x:Op[Int]) extends Op[Int]
case class To(x:Op[Int]) extends Op[Int]

case class Target(a:Op[Int], b:Op[Int]) extends ...
// and lots of other similar case classes

...有一个函数,可以接受任意 case 类并返回它的副本,并将 From 类型的任何元素替换为 To 类型的实例。


如果您原谅这个插件,我想您会发现我们的重写组件Kiama 语言处理库 http://kiama.googlecode.com非常适合这种目的。它提供了一种非常强大的战略规划形式。

这是重写的完整解决方案To's to From位于由案例类实例组成的树中。

import org.kiama.rewriting.Rewriter

class Op[T]
case class Leaf (i : Int) extends Op[Int]
case class From (x : Op[Int]) extends Op[Int]
case class To (x : Op[Int]) extends Op[Int]

case class Target1 (a : Op[Int], b : Op[Int]) extends Op[Int]
case class Target2 (c : Op[Int]) extends Op[Int]

object Main extends Rewriter {

    def main (args : Array[String]) {
        val replaceFromsWithTos =
            everywhere {
                rule {
                    case From (x) => To (x)
                }
            }

        val t1 = Target1 (From (Leaf (1)), To (Leaf (2)))
        val t2 = Target2 (Target1 (From (Leaf (3)), Target2 (From (Leaf (4)))))

        println (rewrite (replaceFromsWithTos) (t1))
        println (rewrite (replaceFromsWithTos) (t2))
    }

}

输出是

Target1(To(Leaf(1)),To(Leaf(2)))
Target2(Target1(To(Leaf(3)),Target2(To(Leaf(4)))))

的想法replaceFromsWithTos值是rule构造提升了一个偏函数,使其能够对任何类型的值进行操作。在这种情况下,偏函数仅定义在From节点,将它们替换为To节点。这everywhere组合器说“将我的参数应用于树中的所有节点,保留参数不适用的位置不变。

除了这种简单的重写之外,我们还可以做更多的事情。看主要的 Kiama 重写文档 https://code.google.com/p/kiama/wiki/Rewriting了解血淋淋的细节,包括更多示例的链接。

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

一般重写 Scala 案例类 的相关文章

随机推荐

  • 更新 PartialView mvc 4

    哎呀 如何使用模型中的数据刷新部分视图 第一次 当页面加载时它可以正常工作 但当我从操作中调用它时却不能正常工作 我创建的结构如下所示 在我看来任何地方 Html RenderAction UpdatePoints 我的部分观点 更新点 h
  • 添加和提交文件后Git推送不起作用

    I m new to Github and Git tried to use gitbash on Windows After adding and committing files If I add the git push cmd Th
  • 使用 Firebase 验证用户手机号码的正确方法

    我知道我可以使用Firebase s电话验证开启Android and iOS 但问题是有关客户端验证的信息很容易在客户端被伪造 因为我只使用服务器端SSL证书 所以 只有客户端知道服务器是可信的 因此 我决定在服务器端发送手机号码并在那里
  • (不?)使用 JavaScriptSerializer 将 xml 文件(未知模式)转换为 c# 中的 json

    JavascriptSerializer 是将 xml 文件 未知模式 转换为 json 字符串的 工具 吗 这里有一些线程讨论如何在 C 中将 xml 转换为 json 以及一些推荐的专用解决方案 http www phdcc com x
  • 从 CMSampleBuffer 播放音频

    我在 iOS 中为群组创建了一个视频聊天应用程序 我一直在寻找一些方法来分别控制不同参与者的音频音量 我找到了使用静音和取消静音的方法isPlaybackEnabled in RemoteAudioTrack 但不控制音量 我还想我们是否可
  • 使用 Node.JS 客户端库插入 Google Analytics 内容实验

    我正在尝试使用 Node js 客户端库配置内容实验 但无法计算出语法 我应该将主体 实验资源 放置在哪里 如此处所述 https developers google com analytics devguides config mgmt
  • WCF 数据合约中可以包含 WCF 操作合约吗?为什么?

    我有一份数据合同 说是用户 它是可序列化的并且可以通过网络传输 我想要一个操作合约 SaveUser 我可以将 SaveUser User user 作为操作合同保留在我的服务合同中 但我可以将其作为自己的行为保留在我的数据合约本身中吗 理
  • 将行从 0 折叠到 0

    对于这样的数据集 Incident ID date product INCFI0000029582 2014 09 25 08 39 45 foo INCFI0000029582 2014 09 25 08 39 48 bar INCFI0
  • 在测试环境中设置default_url_options似乎不起作用

    我已将以下代码放入我的config environments test rb file config action mailer default url options host gt localhost 3000 但是当我运行测试时 所有
  • Symfony 3.0 - 无法加载资源“。” - 自定义路线加载器

    我正在努力将我的一个项目升级到 SF 3 该项目使用了一些自定义路由加载器 这些加载器之前工作没有问题 现在我得到了FileLoaderLoadException指出resource 无法加载 我看了一下文档 http symfony co
  • 您常见的 Magento 配置错误有哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用SchemDraw库自动保存图像

    我想在Python中使用这个库来生成电气图 https cdelker bitbucket io SchemDraw https cdelker bitbucket io SchemDraw 我想在服务器中运行这段代码 这个想法是生成图像
  • 如何在代码生成过程中简化包含变量的 C 风格算术表达式?

    我正在尝试优化编译器中的表达式求值 算术表达式都是C风格的 并且它们可以包含变量 我希望尽可能简化表达 例如 3 100 A B 100 3 100可以简化为409 300 A B 主要取决于分配律 结合律和交换律 我遇到的主要困难是如何将
  • Swift 中的数据封装

    我已阅读全文斯威夫特书 https itunes apple com us book swift programming language id881256329 mt 11 并观看了所有全球开发者大会视频 https developer
  • 仅在 MarshMallow(6.0 和 6.0.1)上使用 MapActivity 进行 MapView 会使应用程序崩溃

    我正在使用 MapActivity 扩展我的活动 以动态实现 MapView 其中包含显示 mapView 的片段 public abstract class BaseHomeActivity extends MapActivity 我已经
  • iframe 不读取 Chrome 中的 cookie

    Chrome 不允许子 iframe 读取自己的 cookie 我有一个带有子 iframe 的父网页 家长在https first site com 孩子在 父级内部 cookie set with 小路 安全 真实 仅http 假 域名
  • ROW() 函数在 SUM() 和 SUMPRODUCT() 中的行为不同

    问题定义 在单元格中输入任意数字A1 现在在第一行的任意位置尝试以下公式 SUM INDIRECT A ROW and SUMPRODUCT INDIRECT A ROW 第一个公式进行计算 第二个公式给出 VALUE 错误 这是由于ROW
  • 找到分类的重要特征

    我正在尝试使用逻辑回归模型对一些脑电图数据进行分类 这似乎给出了我的数据的最佳分类 我拥有的数据来自多通道 EEG 设置 因此本质上我有一个 63 x 116 x 50 的矩阵 即通道 x 时间点 x 试验次数 有两种试验类型 均为 50
  • 如何在没有 Express 的情况下通过 Mongoose 与 MongoDB 交互?

    我想要一个可以牢固掌握 CRUD 操作如何工作的环境 到目前为止 我一直在使用views看看数据是什么样子 但由于明显缺乏灵活性 这种方法并不是那么有洞察力 这就像在黑暗中开车一样 现在我希望能够通过 Mongoose 提供的功能来处理 M
  • 一般重写 Scala 案例类

    是否可以通用地替换案例类中的参数 更具体地说 假设我想要一个接收 查找 案例类和 替换 案例类 如语法规则的左侧和右侧 以及目标案例类的替代函数 并且该函数将返回将查找案例类的参数替换为替换案例类的新案例类 该函数还可以简单地采用一个案例类