2016-04-14 78 views
2

我无法理解IFn和fn之间的差异。Clojure中IFn和Fn的区别

你能举个例子吗?

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

(fn? x) 

(ifn? x) 

他们表现得像相同。

+1

请告诉我们您对'IFn'和'fn'的理解以及您不清楚什么,所以我们知道需要澄清的事项。 –

+0

@PiotrekBzdyl(fn?x)和(ifn?x)函数表现相同(近似) –

回答

13

Clojure的文档描述了差异很清楚:

(fn? x) 返回true如果x实现FN,即是通过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 ...)创建的)。

+1

请注意,'IFn'是一个适当的接口,其特征在于许多'apply'方法。但'Fn'是一个空接口:它可以作为一种标签附加到任何类。 – Thumbnail