【问题标题】: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 Cookbook 的 this chapter。也许周围的也是如此。

标签: 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] 不是关键字,而是向量。向量不能用作查找函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 2012-08-20
        相关资源
        最近更新 更多