如何在clojure中对数组的所有元素应用函数并将结果作为数组



通常我想知道,当我们有一个对象数组时,它可以用特定的函数计算出与"JavaScript中的object Literal"相同的属性。我想在clojure中为我的数组创建该属性,以便对其应用一些计算,例如排序或根据该属性更简单地查找最大值。例如,在本例中如何尝试查找最大值?

(def aSqh (fn [x] (* x x)))
(def maSqh (max (apply aSqh [1 2 3 4])))

输出是对象而不是数字的错误

您似乎在考虑一个映射操作(采用一个参数和一个集合的函数,用该元素上的函数的结果替换每个元素),它在Clojure中被称为mapapply是一个函数,用于将集合管道化为函数,就好像将每个元素作为一个单独的参数提供给它们一样。通常,您希望将它与变元函数(即max等函数,其参数数量可变)一起使用。例如

(def maSqh (apply max (map aSqh [1 2 3 4]))) ;;=> 16

如果要在执行映射后保留集合的数据类型,可以使用intoempty:

(defn preserving-map [f coll]
  (into (empty coll) (map f coll)))
(preserving-map aSqh [1 2 3 4]) ;;=>[1 4 9 16]
(preserving-map aSqh #{1 2 3 4}) ;;=> #{1 4 9 16}

但这消除了map通常给我们带来的(有用的)惰性。对于向量的特殊情况(如[1 2 3 4]),这种用例足够常见,以至于有mapv急切地执行映射并将其放入向量中。

最新更新