请分享您的想法,参与2024 Clojure状态调查!

欢迎!请查看关于页面,了解更多关于如何使用本站的信息。

0
集合

从理论角度来看,Map和一元函数之间实际上并没有区别

您对函数实现Map接口有什么看法?这会有用吗?如果已经考虑过这个方案,但最终决定不这么做,理由是什么?我很想了解你们的想法

3 个答案

+1

Selected Selected by
 
最佳答案

将事物做成函数是非常有实用性的,因为这是“你可以调用的东西”的主要抽象。将函数转换为映射(数据)的实用性相对较少。你不能像读取/打印数据那样轻松地读取/打印它们,你通常不能与其他数据一起组合,等等。另外,虽然所有映射都可以作为一个查找函数来调用,但不是所有函数都可以作为一个映射来调用,所以这仅适用于一个非常窄的功能集。所以,我认为这没有什么用处,我也看不到从中获得的任何好处。

+1

你试图解决什么问题?

并没有真的试图解决问题
我只是在想,符号和关键字可以作为接受第二个参数(一个映射)作为查询的功能来操作

所以就在想,函数是否也是一种映射,所以 (:key some-fn) 应该可以工作,但没关系,因为我们可以将其写为 (some-fn :key)

我认为关键字/符号作为函数只是一个方便的方式?
但我想如果它以任何方式有益,我会考虑的
同样地,请考虑以下情况,你可以 say (some-map "a-key"),但你不能 say ("a-key" some-map),你也可以 say (some-vector 42),但你不能 say (42 some-vector) -- 它不是对称的(也没有任何理由是)~
by
完全说得通:我不是语言设计者,只是想尝试理解这种思考过程
+1
by

从语义上来说,Map的一些属性是无法映射到函数上的。Map有元素数量,允许枚举包含的所有元素,而这是函数无法完成的。

我看到的另一个缺点是get的不可预测的复杂性。目前在调用Map上的get时,你可以预期操作是相对较快的。对于(get itentity 1000)而言是正确的,但是对于(get #(do (Thread/sleep %) %) 1000)则不成立。我喜欢Clojure的可预测执行时间,比如conj,它保证了它将是O(1),而不会保证元素将被插入到coll的末尾。

by
哇,那个第1点 @vlaaad 提到的非常有道理。差点就忘了:)谢谢你们俩
...