2024年Clojure状态调查!中分享您的看法。

欢迎!请查看关于页面了解这个功能的一些详细信息。

0 投票
集合

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

您觉得将函数实现为Map接口怎么样?会有用吗?如果是这样的想法,但你们决定不这样做,为什么?我很想了解这个想法。

3 个答案

+1 投票

已选中
 
最佳答案

将事物做成函数有很多用途,因为这是“你可以调用的东西”的主要抽象。将函数变成数据(Map)的用途要少得多。你不能像数据一样轻松地读取/打印它们,通常不能与其它数据组合等。另外,虽然所有Map都可以作为查找函数调用,但并非所有函数都可以作为Map调用,所以这只能应用于窄小的函数集。因此,我认为这不太有用,我不认为会有从中获得的任何好处。

+1 投票

你试图解决什么问题?

并没有真正想解决问题
我只是看看符号和关键词如何作为函数,对这些函数传递的第二个参数(即map)进行查找

所以我很好奇,一个函数也是一种map,所以(:key some-fn)应该可以工作,但这没关系,因为我们总是可以这样写(some-fn :key)

我认为关键词/符号作为函数只是一个便利吧?
但我肯定会考虑它是否在任何方面都有帮助
此外,考虑一下,你可以这么说(some-map "a-key"),但你不能说("a-key" some-map),你可以这么说(some-vector 42),但你不能说(42 some-vector) —— 这不是对称的(也没有理由要对称)。在关联性事物上,许多可以作为键/索引的东西不能像函数一样用于第一个位置。
完全有道理啊 :) 我不是一个语言设计者,所以只是尝试理解思考过程。
+1 投票

从语义上讲,一些Map属性无法映射到函数。Map有元素数量,允许列举它们包含的所有元素,这是不可能用函数来做的。

我觉得另一个缺点是get的不确定复杂度。目前,当在Map上调用get时,你预期操作速度是合理的。在(get itentity 1000)的情况下它是成立的,但在(get #(do (Thread/sleep %) %) 1000)的情况下就不成立了。我喜欢Clojure可预测的执行时间,比如conj,它保证是O(1),而不是保证元素将被插入到coll的末尾。

哇,@vlaaad的第一个观点非常有道理。差一点就把它忘了,谢谢你们俩。
...