【问题标题】:Differences between IFn and Fn in ClojureClojure 中 IFn 和 Fn 的区别
【发布时间】:2016-04-14 11:51:59
【问题描述】:

我无法理解 IFn 和 fn 之间的区别。

你也可以举个例子吗?

请提供这些功能之间的区别:

(fn? x)

(ifn? x)

它们的行为相同。

【问题讨论】:

  • 向我们提供您对IFnfn 的理解以及您不清楚的地方,以便我们知道需要澄清的地方。
  • @PiotrekBzdyl (fn?x) 和 (ifn?x) 函数行为相同(大约)

标签: clojure functional-programming clojurescript


【解决方案1】:

Clojure 文档非常清楚地描述了差异:

(fn? x) 如果 x 实现了 Fn,即是通过 fn 创建的对象,则返回 true。

(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 ...) 创建的)。

【讨论】:

  • 请注意,IFn 是一个适当的接口,具有许多 apply 方法的特点。但是Fn是一个空接口:它可以作为一种标签附加到任何类。
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2010-11-29
  • 2012-11-16
  • 2021-06-23
相关资源
最近更新 更多