请在2024 Clojure 状态调查!中分享您的想法。

欢迎!请访问关于页面以获取更多关于如何使用本站的信息。

0
集合

从理论角度来看,Map和一元函数之间并没有真正的区别

您对函数实现Map接口有什么看法?这会有用吗?如果是这样的想法,但你们决定不这样做,为什么?我很乐意了解您们的思考过程

3 个回答

+1

被选中
 
最佳答案

将事物做成函数有很大的实用性,因为这是实现“可以调用的东西”的主要抽象方式。将函数转换为数据(Map)的实用性要小得多。你无法像处理数据那样轻松地读取/打印它们,通常无法将它们与其他数据进行组合等。此外,虽然所有Map都可以作为查找函数来调用,但并不是所有函数都可以作为Map来调用,因此这只能应用到函数的狭窄子集。所以,我认为这并不实用,我看不到从中获得的任何好处。

+1
by

你正在尝试解决什么问题?

by
并没有真正尝试解决问题
我只是看看符号和关键字如何作为函数执行第二个参数(即映射)的查找

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

我认为关键字/符号作为函数只是一个便利的用法?
by
但我会肯定地认为它即便以任何方式也是有益的。
by
此外,请注意,您可以写成(some-map "a-key"),但不能写成("a-key" some-map),您可以说(some-vector 42),但不能说(42 some-vector) -- 它不具有对称性(并且没有理由要具有对称性)。关联对象中可以作为键/索引的很多东西,不能像函数一样用于第一个位置。
by
完全合理 :) 我不是语言设计者,只是想要理解这种思路
+1

从语义上讲,Map的一些属性无法投影到函数中。Map有元素计数,允许枚举包含的所有元素,这是无法通过函数实现的。

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

哇,vlaaad提到的第一个点非常有意义。几乎忘了这件事 :) 谢谢你们两个
...