请在2024年Clojure调查问卷中分享您的想法!

欢迎!请查看关于页面了解有关此信息的一些更多信息。

0
Collections

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

您对函数实现Map接口有什么看法?这会很有用吗?如果这个想法曾经考虑过,但最终决定不这么做,为什么呢?很想了解这个想法。

3 答案

+1

最佳答案
 
最佳答案

将事物做成函数非常有用,因为这是“你可以调用的东西”的主要抽象。将函数转换为数据(Map)则少了许多实用性。你不能像处理数据那样轻松地阅读/打印它们,通常不能与其他数据进行组合,等等。此外,虽然所有Map都可以作为一个查找函数来调用,但并非所有函数都可以作为Map调用,因此这只能适用于非常有限的函数集合。所以,我认为这不实用,我看不到从中获得的任何好处。

+1

您试图解决什么问题?

实际上并没有试图解决问题
我只是想了想符号和关键字如何充当函数来在传递给它们的第二个参数(即映射)上执行查找。

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

我认为关键字/符号作为函数只是一个便利的方式?
但我肯定要考虑它是否在某种程度上有所帮助。
此外,您可以考虑,您可以写(some-map "a-key"),但不能写("a-key" some-map),您可以说(some-vector 42),但不能说(42 some-vector) —— 它不是对称的(并且没有理由要对称)。在关联数据结构中,有大量可以作为键/索引使用的东西,但不能作为函数的第一个位置使用。
完全符合逻辑 :) 我不是语言设计者,所以只是试图理解思考过程
+1

从语义上来说,映射的某些属性是不可能投射到函数上的。映射有元素计数,映射允许枚举它们包含的所有元素,这是不可能用函数完成的。

我看到另一个缺点是 get 的不可预测复杂性。目前,当在映射上调用 get 时,你可以期望操作相对较快。对于 (get itentity 1000) 来说这成立,但对于 (get #(do (Thread/sleep %) %) 1000) 就不成立了。我喜欢 Clojure 的可预测执行时间,例如使用 conj,它保证是 O(1),尽管不保证项目将被插入到 coll 的末尾。

Wow,@vlaaad 提出的第一个观点非常有道理。差点忘了这件事 :) 感谢你们两位
...