2

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

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

4

1 回答 1

2

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

  • 如果你想定义高效的分派函数,这些函数可以多态地处理不同的数据类型,你通常会使用协议。deftype不同的数据类型可能意味着用或定义的 Java 类或 Clojure 类型defrecord
  • core.match是一个很好的通用模式匹配库
  • 方法提供通用多态分派,可以分派/匹配其参数的任何函数。比协议稍慢,但非常灵活。

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

  • 不要低估使用纯数据(存储在常规地图、列表、向量中)做事。在大多数情况下,这是 Clojure 中最简单、最灵活的方法。
  • 如果您认为这还不够,我建议defrecord而不是deftype在大多数情况下:defrecord 创建一些行为类似于 hashmap 的东西,因此它非常灵活且用户友好。对于编写库和编译器等的人来说,deftype 更像是一种低级构造。
于 2013-02-08T07:48:41.473 回答