【问题标题】:compound-key as lookup function in clojure复合键作为clojure中的查找函数
【发布时间】:2015-08-13 07:04:14
【问题描述】:
在 clojure 中,您可以同时使用映射和键作为查找功能,因此
({:a 1 :b 2} :a) 和 (:a {:a 1 :b 2}) 都是可行的查找函数。
那么为什么可以使用地图作为复合键的查找函数,而反过来却不行呢?
这意味着({[:compound :mebaby] 1} [:compound :mebaby]}) 将返回1,但([:compound :mebaby] {[:compound :mebaby] 1}) 将抛出错误。
【问题讨论】:
标签:
clojure
lookup
compound-key
【解决方案1】:
关键字实现IFn 作为其功能之一,以使其方便用作键。他们实现的 fn 是在关联结构参数中查找自己。对于像您的向量这样的集合,情况并非如此,因为它们实现了 IFn 以在参数键处自行查找。
所以({[:compound :mebaby] 1} [:compound :mebaby]}) 询问映射键[:compound :mebaby] 的值是什么,它存在。但是([:compound :mebaby] {[:compound :mebaby] 1}) 询问向量索引{[:compound :mebaby] 1} 处的值是多少。这不是整数,所以它不能是向量中的索引/键并引发错误。
【解决方案2】:
原因是:你的compound-key不再是keyword了。它现在是一个向量,虽然仍然是一个IFn,但它只接受整数,比如i,作为参数,返回向量的第ith 元素。
我怀疑您真正想要的是从嵌套映射中提取值,例如从 {:a {:b "c"}} 中提取字符串“c”。如果是,这两种形式是等价的:
(get-in {:a {:b "c"}} [:a :b])
;=> "c"
((comp :b :a) {:a {:b "c"}})
;=> "c"
【解决方案3】:
您认为可以使用 key 作为查找函数的假设是不正确的。您可以使用 关键字 作为查找函数。在您的示例中,:a 是一个关键字。因此它可以用作查找功能。但是[:compound :mebaby] 不是关键字,而是向量。向量不能用作查找函数。