在某些函数式编程书籍中,他们将元组定义为[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中存在三种类型的高阶函数:
map, filter, reduce, take-nth, group-by
partial, comp, juxt
#( ... %1 %2)
我通常使用3型来实现2型也可以做的许多事情,因为我觉得3型的可读性更好。但是,我觉得类型2的功能确实扩大了我的想象力,对我来说,这是它们的真正价值。
此外,最近发布的原子查询现在支持返回实体集。最初它只能返回元组集。
答案 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}