2016-04-14 5 views
2

IFnとfnの違いを理解できませんでした。ClojureのIFnとFnの相違

例をあげることもできますか?

それらの機能の違いを教えてください:

(fn? x) 

(ifn? x) 

は、彼らが同じように振る舞います。

+1

'IFn'と' fn'についての理解を提供してください。明確ではないものがありますので、明確化が必要なものがわかります。 –

+0

@PiotrekBzdyl(fn?x)関数と(ifn?x)関数は同じ動作をします(約) –

答えて

13

Clojureのドキュメントはかなり明確に違いを説明します

(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 ...)で作成されていない場合でも)を表します。

+1

'IFn'は適切なインタフェースであり、多くの' apply'メソッドが特徴です。しかし、 'Fn'は空のインターフェースです:それはタグの一種としてどんなクラスにも取り付けることができます。 – Thumbnail

関連する問題