2016-07-29 55 views

回答

10

接口函数。 Clojure使用Java接口的大写“I”前缀和Java抽象类的“A”。

IFn JavadocIFn source

2

见Clojure的方面也有fnifn之间多了一个区别:

user> (defn f [x] x) 
#'user/f 

user> (map fn? [f #(list %) :keyword 'sym {:a 10} #{123} [1 2 3] 10 "asd"]) 
(true true false false false false false false false) 

user> (map ifn? [f #(list %) :keyword 'sym {:a 10} #{123} [1 2 3] 10 "asd"]) 
(true true true true true true true false false) 

所以,你可以看到fn?仅用于实际的作用真的,而ifn?如果对任何事情都成立,那可能是称为功能(如关键字,地图等)

+1

“fn?'仅适用于实际功能”的区别是误导性的。 ':keyword'与'#(list%)'一样是一个“实际功能”。更准确的说法是['fn?'](https://clojuredocs.org/clojure.core/fn_q)测试是否有['fn']返回的对象的类型(https:/ /clojuredocs.org/clojure.core/fn)。 –

+1

:关键字与实际一样多,如果我们谈论它的* callability *,但它的类型仍然是'keyword',所以它显然不是函数。 – leetwinski

+0

对不起,但没有。说一个关键字不是Clojure的具体'Fn'类型的成员是正确的,但是说'Fn'而不是'IFn'确定某个事物是否是“实际函数”是适得其反的。 [这个答案](http://stackoverflow.com/a/6916532/5044950)在解释这个观点方面做得很好。 –