基于 Clojure 类型的比较

dtg*_*dtg 2 functional-programming clojure predicates

我正在尝试测试以下记录类型:

(defrecord FirstOrderState [datum matrix]
  State
  ;; implementation goes here ...
  )
Run Code Online (Sandbox Code Playgroud)

我正在尝试根据上述类型进行分支,但没有得到我需要的结果

(def state (->FirstOrderState datum matrix))

(= (type state) composer.algorithm.markov.state.FirstOrderState)
=> false
Run Code Online (Sandbox Code Playgroud)

但是,查看 的类型state确认它应该匹配:

(type state)
=> composer.algorithm.markov.state.FirstOrderState
Run Code Online (Sandbox Code Playgroud)

这似乎应该有效,因为类似的检查结果如下true

(= (type []) clojure.lang.PersistentVector)
=> true
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?使用下面的 hack 提供了一个解决方案,但不是很优雅:

(= (str (type state)) (str composer.algorithm.markov.state.FirstOrderState))
=> true
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 5

我的第一个猜测是,您已经重新加载了包含记录类型定义的命名空间,并且state命名空间是在其他地方(可能在 REPL 中)定义的,因此composer.algorithm.markov.state.FirstOrderState现在引用了与state创建时所使用的不同的类。

REPL 上的演示:

user=> (defrecord Foo [])
user.Foo
user=> (def foo (->Foo))
#'user/foo
user=> (= (type foo) Foo)
true
user=> (defrecord Foo [])
user.Foo
user=> (= (type foo) Foo)
false
Run Code Online (Sandbox Code Playgroud)