Clojure中IFn和Fn之间的差异

Ert*_*tin 2 functional-programming clojure clojurescript

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

你能举个例子吗?

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

(fn? x)

(ifn? x)
Run Code Online (Sandbox Code Playgroud)

他们表现得一样.

Pio*_*dyl 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
Run Code Online (Sandbox Code Playgroud)

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