在Clojure中,如何添加对空常见函数的支持?并指望我的新类型?

int*_*tar 2 clojure

据我所知,Clojure使解决"表达问题"变得"容易".

但我找不到如何做到这一点的细节.如何创建一个处理空的东西的新类型(如defrecord)?和数?

erd*_*dos 5

这两个例子是空的?count函数是Clojure核心的一部分,它们的实现是由性能考虑因素驱动的,因此它们可能不是解决表达式问题的最佳例子.无论如何:

  • 您可以empty?通过seq对类型进行处理来完成工作,例如通过实现Seqable接口.
  • 您可以count通过实现Counted接口来完成工作.

示例代码:

(deftype Tuple [a b]
  clojure.lang.Counted
  (count [_] 2)

  clojure.lang.Seqable
  (seq [_] (list a b)))

(count (->Tuple 1 2)) ;=> 2
(empty? (->Tuple 1 2)) ;=> false
Run Code Online (Sandbox Code Playgroud)

新功能的更通用的解决方案是:

  • 为您的功能创建一个方法.现在,您需要defmethod为支持的类型编写自定义方法(via ).
  • 创建包含您的功能的协议,并通过extend-protocol或使类型满足协议extend-type.

在任何一种情况下,您都可以随时为新类型或现有类型创建默认实现和新实现.即使在运行时!