clojure - clojure 中是否有类似 ML 的数据类型声明和模式匹配的内容?

标签 clojure pattern-matching ml

我对 sml(1 个月)和 clojure(1 周)都是新手。几周前我学习了 sml 中的数据类型和模式匹配,想知道 clojure 中是否有类似的东西。 那里似乎有几个模式匹配库。他们是否拥有机器学习模式匹配的全部能力? 数据类型怎么样?我是否必须使用像 deftype 这样的东西来创建我自己的数据类型?如果是这样,我该怎么做? deftype 对我来说看起来相当复杂。

如果人们在 lisp 世界中不使用数据类型,那么在 clojure 中与数据类型进行模式匹配的惯用方法是什么?

最佳答案

在 Clojure 世界中,您可以使用一些“点菜”多态性选项:

  • 您通常会使用protocols如果您想定义能够与不同数据类型进行多态工作的高效调度函数。不同的数据类型可能意味着使用 deftypedefrecord 定义的 Java 类或 Clojure 类型。
  • core.match是一个非常好的通用模式匹配库
  • Multimethods提供通用多态调度,可以调度/匹配其参数的任何函数。比协议(protocol)稍慢,但非常灵活。

至于定义自己的数据类型:

  • 不要低估纯数据(存储在常规 map 、列表、向量中)的作用。在大多数情况下,这是 Clojure 中最简单、最灵活的方法。
  • 如果您认为这还不够,我建议在大多数情况下使用 defrecord 而不是 deftype:defrecord 创建一些行为类似于 HashMap 的内容,因此它是非常灵活且用户友好。 deftype 对于编写库和编译器等的人来说更像是一个低级构造。

关于clojure - clojure 中是否有类似 ML 的数据类型声明和模式匹配的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14766007/

相关文章:

javascript - 输入模式匹配

functional-programming - 详尽的模式

tomcat - Compojure 静态资源在开发中工作但在生产中不工作

java - 为什么 Clojure 现在在 JNLP 中失败了?

regex - 从两个文本文件中获取公共(public)行

f# - 此质因数分解代码适用于小数,但对于大数会因 OutOfMemoryException 而失败?

sml - 'struct' 是否有类似包含的命令,类似于 'include' 的 'sig' ?

recursion - 标准 ML 斐波那契溢出

C# atom 引用类型等效于 clojure atom

object - 在 clojure 中为对象的特定实例创建代理