flatmap/mapcat是一个可以用作其他高阶函数基础的函数吗?

flatmap/mapcat是一个可以用作其他高阶函数基础的函数吗?,map,clojure,fold,higher-order-functions,flatmap,Map,Clojure,Fold,Higher Order Functions,Flatmap,我们可以看到,我们可以使用reduce/foldl1作为函数 在foldr方面,我们似乎也能够做到这一点。这是17:25时的地图和过滤器 (defn mapr [f coll] (foldr (fn [x r] (cons (f x) r)) () coll)) (defn filterr [pred coll] (foldr (fn [x r] (if (pred x) (cons x r) r)) () coll)) 现在有一些论文解释了这一点

我们可以看到,我们可以使用reduce/foldl1作为函数

在foldr方面,我们似乎也能够做到这一点。这是17:25时的地图和过滤器

(defn mapr [f coll]
  (foldr (fn [x r] (cons (f x) r))
         () coll))

(defn filterr [pred coll]
  (foldr (fn [x r] (if (pred x) (cons x r) r))
         () coll))
现在有一些论文解释了这一点:

BIRD-构造性函数编程讲座-1988

HUTTON-折叠的普遍性和表现力教程-1999

这周我听到有人说:

flatmap mapcat是最基本的,你可以用它来表达很多高阶函数

这里是用mapcat实现的map

=> (defn mymap [f coll] (mapcat (comp vector f) coll))

=> (mymap #(+ 1 %) (range 0 9))

(1 2 3 4 5 6 7 8 9)
但对我来说,这感觉是人为的,因为你们实际上只是在把事情装箱,弄清楚地图本身是否是“基本的”

最后一个示例感觉有点人为的原因是mapcat已经用map定义了。如果你看一下-我们看到类似于:

(defn mapcat
  [f & colls]
    (apply concat (apply map f colls)))
因此,上面的例子只是颠倒了concat,并在mapcat内部重用了map的底层定义——我觉得这是人为的。现在,如果mapcat可以用来定义其他HOF,那就没问题了,但我不知道该怎么做,我希望有人能给我指出这个方向

我的问题是:flatmap/mapcat是一个可以用作其他高阶函数基础的函数吗?

map是一个用于创建mapcat的原语

您可以使用mapcat创建映射,该映射将mapcat还原为构建它所依据的映射


您可以使用这两种方法构建无限多的高阶函数。

谢谢!你能举一个建立霍夫函数的例子吗?每一个以函数为参数的函数都是高阶函数。
(defn mapcat
  [f & colls]
    (apply concat (apply map f colls)))