Clojure 协议与 Scala 结构类型

2024-01-30

看完后里奇·希基的采访 http://www.infoq.com/interviews/hickey-clojure-protocols on 协议 http://clojure.org/protocols在 Clojure 1.2 中,对 Clojure 知之甚少,我对 Clojure 协议有一些疑问:

  • 他们是否打算做同样的事情结构类型 http://codemonkeyism.com/scala-goodness-structural-typing/在斯卡拉?与结构类型相比,协议有哪些优势(性能、灵活性、代码清晰度等)?它们是通过反思来实现的吗?
  • 关于与 Scala 的互操作性问题:Scala 中可以使用协议代替结构类型吗?它们可以在 Scala 中扩展(如果“扩展”术语可以应用于协议)吗?

完全不相关。

Scala 是一种静态类型语言。 Clojure 是一种动态类型语言。这种差异从根本上塑造了两者。

结构类型是静态类型,句号。它们只是让编译器静态证明对象将具有特定结构的一种方法(我在这里说证明,但强制转换一如既往会导致虚假证明)。

Clojure 中的协议是一种创建动态调度的方法,它比反射或在映射中查找内容要快得多。从语义意义上来说,它们并没有真正扩展 Clojure 的功能,但在操作上它们比以前使用的机制要快得多。

Scala 特性更接近协议,Java 接口也是如此,但同样存在静态与动态问题。 Scala 特征必须在编译时与类关联,类似于 Java 接口。 Clojure 协议甚至可以由第三方在运行时添加到数据类型中。

通过包装器/代理模式或动态代理等机制,在 Java 和 Scala 中可以实现类似 Clojure 协议的功能(http://download.oracle.com/javase/1.4.2/docs/guide/reflection/proxy.html http://download.oracle.com/javase/1.4.2/docs/guide/reflection/proxy.html)。但这些会比 Clojure 协议笨拙得多,而且正确获取对象标识也很棘手。

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

Clojure 协议与 Scala 结构类型 的相关文章

  • Akka-Streams 收集数据(Source -> Flow -> Flow (collect) -> Sink)

    我对 Scala 和 Akka 完全陌生 我有一个简单的 RunnableFlow Source gt Flow do some transformation gt Sink runForeach 现在我想要这样的东西 Source gt
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • 获取SettingKey[T]的值

    我正在开发一个用于文档生成的插件 我想将所有生成的文件输出到我选择的目录中 该目录可以是SBT的子目录target目录 如下 val newTargetDirectory SettingKey File document target di
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 为什么 Objective-C 方法名称的最后一部分必须带有参数(当有多个部分时)?

    在 Objective C 中 您不能声明最后一个组件不带参数的方法名称 例如 以下内容是非法的 void take id theMoney andRun void take id yourMedicine andDontComplain
  • 为什么我收到无法动态绑定非动态变量?

    我正在尝试使用 clojure tools trace 命名空间的 dotrace 函数 dotrace my function my function 5 但我收到了这个错误 IllegalStateException 无法动态绑定非动态
  • Scala 和 Python 的通行证

    我想知道 是否有相当于 python 的 pass 表达式 这个想法是编写没有实现的方法签名 并编译它们只是为了对某些库原型的这些签名进行类型检查 我能够使用以下方法模拟这种行为 def pass A A throw new Excepti
  • Scala 中的随机列表[重复]

    这个问题在这里已经有答案了 我对 scala 中的随机播放列表有疑问 使用scala util Random 例如我有 val a cyan val b magenta val c yellow val d key val color Ra
  • Clojure:只能从尾部位置重复

    我正在尝试递归地反转列表 但是我得到了Can only recur from tail position运行时 这到底意味着什么 如何改进我的代码才能使其正常工作 defn recursive reverse coll loop coll
  • Perl 语言的目标是在运行时生成快速的程序吗?

    最近有朋友告诉我 看 Perl 从来就不是为了快而设计的 真的吗 我能找到的相关信息是来自维基百科 http en wikipedia org wiki Perl Overview 该语言旨在实用 易于使用 高效 完整 而不是美观 微小 优
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • 如何编写 Clojure 宏来从字符串创建正则表达式?

    我正在创建一个方便的宏 部分便利在于可以仅使用字符串来指定正则表达式 而不是使用 re 表示法 我无法弄清楚的一部分是如何让宏获取字符串并将其重写为 Clojure 正则表达式 例如 生成 re 符号 我认为这是一个语法 转义问题 我的第一
  • 在泛型方法中返回原始集合类型

    假设我们想要创建一个像这样的函数minBy返回集合中同等极简主义的所有元素 def multiMinBy A B Ordering xs Traversable A f A gt B val minVal f xs minBy f xs f
  • 面向对象编程语言中的引用默认情况下是否应该不可为空? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Spark:导入UTF-8编码的文本文件

    我正在尝试处理一个包含很多特殊字符的文件 例如德语变音符号 o 等 如下所示 sc hadoopConfiguration set textinputformat record delimiter r n r n sc textFile f
  • 在 Scala 中提取案例类字段名称

    我有一个案例类 case class A field1 String field2 Int 我想在某些代码中引用确切的字符串 field1 例如 val q Query field1 gt hello performQuery q 现在我必

随机推荐

  • 为什么我们需要快速正文解析器?

    我遇到了很多博客和文章 他们建议使用 body parser 来解析请求正文数据 有没有办法在不使用任何中间件的情况下解析数据或从正文获取正文数据 默认情况下 express 只为您提供原始 HTTP 请求正文req论证作为Incoming
  • Lambda 没有自动推断返回类型

    当我回答我自己的问题时https stackoverflow com a 32115498 383779 https stackoverflow com a 32115498 383779 我又有一个疑问了 In const CArray
  • 如何逐行运行Linux程序

    我想使用一些调试器逐行运行 GTK C 程序 我从未调试过 Linux 程序 那么在哪里可以找到针对初学者如何调试代码的说明呢 我只是有一个想法 我必须从网上下载源代码 使用调试符号编译项目并通过 DDD 或 GDB 运行源代码 那么任何人
  • 切换当前元素的可见性

    我正在尝试写一个函数toggle active单击即可显示隐藏内容 再单击一次即可再次折叠内容 可悲的是 它不起作用 你能帮我修改一下吗 function toggle active this var x this nextSibling
  • XDebug 无法在 VScode 中进行 php 调试

    即使在所有配置之后 使用 xdebug 和 xampp 在 vscode 中进行 PHP 调试也无法正常工作 这是我的 php ini 文件配置 zend extension D Xampp php ext php xdebug 3 0 0
  • CakePHP 中页面别名的自动路由

    我正在使用 CakePHP 框架创建一个 CMS 通过 CMS 创建的每个页面都将有其唯一的 URL 别名 这还取决于虚拟文件夹结构 例如 www site com level 1 about us www site com level 2
  • 如何让 async/await 等待 Observable 返回

    对 Angular 相当陌生 并且在 Promises Observables 和 async await 方面遇到困难 我有一个功能需要当前用户详细信息来执行某些任务 为此 我编写了一个获取用户详细信息方法 该方法返回一个承诺 并且任务在
  • 来自 Pivot 的 Seaborn 热图中的数据顺序

    所以我有一个使用seaborn创建的热图 revels rd pivot Flavour Packet number Contents ax sns heatmap revels annot True fmt d linewidths 0
  • 为购物车项目和产品设置正确的 jpa 映射

    我正在通过一些例子学习jpa 涉及购物车和购物车物品 我将它们定义如下 但不太确定要使用哪个映射 Entity class Product private Long id private String name Entity class C
  • 如何在 Facebook 应用程序中添加画布和安全画布 URL

    我正在尝试开发 Facebook 教程 Friends Smash 但我遇到了一个大问题 它没有显示任何添加画布和安全画布 URL 的选项 设置 gt gt 添加平台 gt gt 网站 我得到以下选项 如何添加画布和安全画布 URL 画布和
  • 如何使用解析表证明左递归语法不在LL(1)中

    我有一个语法 想证明它不在 LL 1 中 S gt SA A A gt a 由于它是左递归语法 为了找到第一个和后续集合 我消除了左递归并得到 S gt AS S gt AS Empty A gt a first of A a follow
  • 将 DAO 与复合对象一起使用

    我正在尝试重写一堆 DAO 这里的设置是 仅纯 JDBC 无 JPA ORM 任何形式 没有使用任何接口 插入对象之前进行大量检查 业务对象紧密相连 我的主要问题是 如何持久 检索由多个其他对象组成的业务对象 例如我的 CustomerDA
  • NGRX - 如何计算商店中商品的属性

    我们在 Angular 应用程序中使用 NGRX 数据来自 API 某些属性以未格式化的字符串形式来自 API 因此我们需要对其进行格式化 当然 这可以在 HTML 中完成 但问题是在 HTML 和 TypeScript 中的多个位置都需要
  • ZF2 - 使用导航视图助手的多个导航菜单

    我正在尝试将主导航与子菜单结合使用以进行更具体的导航 In my layout我这样调用视图助手 this gt navigation main navigation gt menu 并在我的view我这样称呼它 this gt navig
  • 访问 Spark RDD 时闭包中局部变量的使用

    我有一个关于访问 Spark RDD 时闭包中局部变量的使用的问题 我想解决的问题如下 我有一个应该读入 RDD 的文本文件列表 但是 首先我需要向从单个文本文件创建的 RDD 添加附加信息 此附加信息是从文件名中提取的 然后 使用 uni
  • 将 ShapeRenderer.begin/end 嵌套在 SpriteBatch.begin/end 中

    是否可以使用绘制形状ShapeRenderer之间SpriteBatch begin and end calls 我已经尝试过 但没有结果 只绘制了 SpriteBatch 纹理 场景中没有形状 示例代码如下 shapeRenderer b
  • Objective-C 接口 - 声明变量与仅声明属性?

    在 Obj c 中 在 interface 中声明变量时 接口 NSObject 我的对象 我的对象 property 不安全 非原子 MyObject myObject 对比 仅将其声明为属性 接口 NSObject property 不
  • 通过 HTTP 回调函数进行 Google 地理编码?

    我想使用谷歌地理编码via HTTP在我的 AJAX Web 应用程序中将城市名称转换为经度和纬度的功能 但是 HTTP 地理编码器功能似乎不存在回调函数 http code google com apis maps documentati
  • 无法将操作提供者强制转换为共享操作提供者

    下面是我的活动的代码 import android app Activity import android os Bundle import android support v7 widget ShareActionProvider imp
  • Clojure 协议与 Scala 结构类型

    看完后里奇 希基的采访 http www infoq com interviews hickey clojure protocols on 协议 http clojure org protocols在 Clojure 1 2 中 对 Clo