Function Clojure记录实施IFn是否是一种良好的做法?

Function Clojure记录实施IFn是否是一种良好的做法?,function,clojure,functional-programming,record,Function,Clojure,Functional Programming,Record,假设我有一个“类似函数”的记录,至少在某种意义上,它表示可以应用于某些参数的操作 我可以通过实现clojure.lang.IFn使其作为一个函数工作,类似于: (defrecord Func [f x] clojure.lang.IFn (invoke [this arg] (f x arg)) (applyTo [this args] (apply f x args))) ((->Func + 7) 1) => 8 (是的,我知道

假设我有一个“类似函数”的记录,至少在某种意义上,它表示可以应用于某些参数的操作

我可以通过实现
clojure.lang.IFn
使其作为一个函数工作,类似于:

(defrecord Func [f x]
  clojure.lang.IFn
    (invoke [this arg]
      (f x arg))
    (applyTo [this args]
      (apply f x args)))

 ((->Func + 7) 1)
 => 8
(是的,我知道我刚刚重新实现了
partial
…这只是一个例子:-)的低级版本

制作一个记录工具
clojure.lang.IFn
是否是一个好的做法


这种方法有什么缺陷吗?

我很惊讶它还没有。记录应该是。所以要回答你的问题,我希望它是它的键的函数,就像地图一样;其他任何事情都会让人惊讶。

我不能直接回答是/否,但我可以分享我的经验

我定义了一个实现的记录
clojure.lang.IFn
。实现IFn是为了让我能够轻松地通过REPL环境进行测试

该记录旨在成为一个作业类,由一名工人处理。因此,我还实现了另一个接口
java.lang.Runnable
run
函数

当我真的将代码放入集成测试时,它抛出了异常。为什么?

工人逻辑是这样的:

  • 它检查作业类是否是可调用的实例,如果是,则调用
    调用
    函数
  • 它检查作业类是否是
    Runnable
    实例,如果是,则调用
    run
    函数

  • 但是,
    clojure.lang.IFn
    已经扩展了
    Callable
    Runnable
    ,因此引发了异常,因为我忘了实现
    call
    函数。

    一条记录似乎实现了
    clojure.lang.Associative
    而不是
    clojure.lang.IFn
    。因此,您可以执行
    (:a some record)
    来查找关键字,但不能精确地查找
    (some record:x)
    。我查过了,但没有看到Rich对此有任何明确的解释。也许这只是一个疏忽。+1的给出是因为@mikera的问题是关于记录而不是类型的。因为记录已经有了类似于映射的语义,这会让人困惑,因为对于类型来说,这个问题并不存在。