在书籍Clojure for the Brave and True中,在涵盖reduce的章节末尾,有一个挑战:
结果证明这比我想象的要难得多(至少对于我这个Clojure初学者来说)。经过很多小时的努力,我想出了这个:如果你想要一个真正让你大开眼界的练习,请尝试使用
reduce
实现map
(defn map-as-reduce
[f coll]
(reduce #(cons (f %2) %1) '() (reverse coll)))
有更好的方法吗?我特别不满意的是,为了使它正常工作,我必须翻转输入的集合。这似乎有点不优雅!
seq
提供其他实现”的评论;此页面上所有map
的实现都适用于所有Seqable
输入。如果你的意思是生成不同类型的序列作为结果,那么我认为这样做没有太大的意义(除了可能会提高性能),因为人们可以轻松地将map
与vec
或其他东西组合起来。 - Sam Estep