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

欢迎!请查看关于页面以了解更多关于此的工作信息。

0
集合

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

您如何看待函数实现Map接口?这将是有用的吗?如果已经考虑过但大家决定不这样做,为什么呢?我很想了解这种思考过程。

3 个回答

+1

selected
 
最佳答案

将事物变成函数有许多实用性,因为这主要是“您可以调用的东西”的抽象。将函数变成数据(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

从语义上讲,Map的一些属性无法投射到函数上。Map有元素的计数,允许枚举它们包含的所有元素,这不能用函数来完成。

我看到的另一个缺点是get的不可预测的复杂度。目前调用map上的get,您可以期望操作速度合理。在(get itentity 1000)的情况下是这样的,在(get #(do (Thread/sleep %) %) 1000)情况下则不然。我喜欢Clojure可预测的执行时间,比如conj,它保证是O(1),但不保证项目会被插入到末尾。

哇,vlaaad提到的第一点很有道理。我差点忘了这个问题!谢谢你们俩
...