我对 sml(1 个月)和 clojure(1 周)都是新手。几周前我学习了 sml 中的数据类型和模式匹配,想知道 clojure 中是否有类似的东西。 那里似乎有几个模式匹配库。他们是否拥有机器学习模式匹配的全部能力? 数据类型怎么样?我是否必须使用像 deftype 这样的东西来创建我自己的数据类型?如果是这样,我该怎么做? deftype 对我来说看起来相当复杂。
如果人们在 lisp 世界中不使用数据类型,那么在 clojure 中与数据类型进行模式匹配的惯用方法是什么?
最佳答案
在 Clojure 世界中,您可以使用一些“点菜”多态性选项:
- 您通常会使用protocols如果您想定义能够与不同数据类型进行多态工作的高效调度函数。不同的数据类型可能意味着使用
deftype
或defrecord
定义的 Java 类或 Clojure 类型。 - core.match是一个非常好的通用模式匹配库
- Multimethods提供通用多态调度,可以调度/匹配其参数的任何函数。比协议(protocol)稍慢,但非常灵活。
至于定义自己的数据类型:
- 不要低估纯数据(存储在常规 map 、列表、向量中)的作用。在大多数情况下,这是 Clojure 中最简单、最灵活的方法。
- 如果您认为这还不够,我建议在大多数情况下使用
defrecord
而不是deftype
:defrecord 创建一些行为类似于 HashMap 的内容,因此它是非常灵活且用户友好。 deftype 对于编写库和编译器等的人来说更像是一个低级构造。
关于clojure - clojure 中是否有类似 ML 的数据类型声明和模式匹配的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14766007/