如果将clojure函数juxt泛化为juxe,即juxe返回哈希图而不是vector,那么该函数juxe有用吗?

时间:2019-06-25 14:24:48

标签: clojure

在某些函数式编程书籍中,他们将元组定义为[a b c]形式,将实体定义为{:a x:b y:c z}形式。

如果我们将t中的juxt作为元组的概念,是否可以将juxe作为实体的概念使用一个更高阶的函数名e

因此,juxe的行为将类似于

((juxe :a a :b b :c c) x) => {:a (a x) :b (b x) :c (c x)}

此功能juxe有用吗?

此问题的一些背景知识。我认为Clojure中存在三种类型的高阶函数:

  • 类型1:高阶模板功能 map, filter, reduce, take-nth, group-by
  • 类型2:高阶装饰功能 partial, comp, juxt
  • 类型3:#( ... %1 %2)

我通常使用3型来实现2型也可以做的许多事情,因为我觉得3型的可读性更好。但是,我觉得类型2的功能确实扩大了我的想象力,对我来说,这是它们的真正价值。

此外,最近发布的原子查询现在支持返回实体集。最初它只能返回元组集。

1 个答案:

答案 0 :(得分:1)

(defn juxe [& kf-pairs]
  (let [pairs (partition 2 kf-pairs)
        [ks fs] (apply mapv vector pairs)]
    (fn [x] (zipmap ks (map #(% x) fs)))))

例如

=> ((juxe :a inc :b dec :c -) 99)
{:a 100, :b 98, :c -99}