clojure - 基于 Clojure 类型的比较

标签 clojure functional-programming predicates

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

(defrecord FirstOrderState [datum matrix]
  State
  ;; implementation goes here ...
  )

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

(def state (->FirstOrderState datum matrix))

(= (type state) composer.algorithm.markov.state.FirstOrderState)
=> false

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

(type state)
=> composer.algorithm.markov.state.FirstOrderState

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

(= (type []) clojure.lang.PersistentVector)
=> true

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

(= (str (type state)) (str composer.algorithm.markov.state.FirstOrderState))
=> true

最佳答案

我的第一个猜测是您已经重新加载了包含记录类型定义的命名空间并且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

关于clojure - 基于 Clojure 类型的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20366130/

相关文章:

clojure - 使用 clojure 的 stm 作为全局状态是否被认为是一个好的实践?

clojure - 为什么参数列表为ArraySeq?

iphone - 在 NSFetchedResultsController 的谓词中获取属性

java - 存储 Clojure(或 JVM)应用程序使用的文件的常规位置

java - 如何使 java 库对 clojure 可见?

c# - 为列表中的每个项目设置权重

f# - 使用 F# 更加地道

python - 将函数的参数(即 lambda)映射到元组?

c# - LINQ to SQL where 子句验证字符串包含列表元素