Clojure中IFn和Fn之间的差异

时间:2016-04-14 11:52:00

标签: clojure functional-programming clojurescript

我无法理解IFn和fn之间的差异。

你能举例说明吗?

请提供这些功能之间的差异:

1 2 6 7 
3 5 8 13 
4 9 12 14 
10 11 15 16

他们表现得一样。

1 个答案:

答案 0 :(得分:13)

Clojure docs非常清楚地描述了这种差异:

  

(fn? x)   如果x实现Fn,则返回true,即通过fn。

创建的对象      

(ifn? x)   如果x实现IFn,则返回true。请注意许多数据结构   (例如集和地图)实现IFn

你可以测试一下:

(fn? (fn [] nil)) ;; => true
(fn? #{}) ;; => false
(fn? {}) ;; => false
(fn? []) ;; => false
(fn? :a) ;; => false
(fn? 'a) ;; => false

(ifn? (fn [] nil)) ;; => true
(ifn? #{}) ;; => true
(ifn? {}) ;; => true
(ifn? []) ;; => true
(ifn? :a) ;; => true
(ifn? 'a) ;; => true

换句话说,fn?表示如果它的参数是一个只是一个函数的对象(用(fn ...)创建),ifn?表示对象是否可以是一个像函数一样调用(即使它不是用(fn ...)创建的)。