gpt4 book ai didi

clojure - 从具有 Clojure 和可读性问题的其他函数传递多个参数函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:11 24 4
gpt4 key购买 nike

我正在尝试使用 SICP 学习函数式编程。我想使用 Clojure。

Clojure 是 Lisp 的一种方言,但我对 Lisp 非常陌生。此代码片段不干净且不可读。如何使用 Lisp 方言编写更高效的代码?

以及如何从其他函数传递多个参数函数?

(defn greater [x y z]
(if (and (>= x y) (>= x z))
(if (>= y z)
[x,y]
[x,z])
(if (and (>= y x) (>= y z))
(if (>= x z)
[y,x]
[y,z])
(if (and (>= z x) (>= z y))
(if (>= y x)
[z,y]
[z,x])))))

(defn sum-of-squares [x y]
(+ (* x x) (* y y)))

(defn -main
[& args]
(def greats (greater 2 3 4))
(def sum (sum-of-squares greats)))

最佳答案

你问的是两个问题,我尽量倒序回答。

应用集合作为参数

要将集合用作函数参数,其中每个项目都是函数的位置参数,您可以使用 apply功能。

(apply sum-of-squares greats) ;; => 25


可读性

至于更普遍的可读性问题:

您可以通过概括问题来提高可读性。从您的代码示例来看,问题似乎在于对集合中的两个最大数字执行平方和。所以,sort 在视觉上会更干净降序排列并取前两项。

(defn greater [& numbers]
(take 2 (sort > numbers)))

(defn sum-of-squares [x y]
(+ (* x x) (* y y)))

然后您可以使用 apply 将它们传递给您的 sum-of-squares 函数。

(apply sum-of-squares (greater 2 3 4)) ;; => 25

切记:排序函数并不懒惰。因此,它会识别并排序您提供给它的整个集合。在某些情况下,这可能会对性能产生影响。但是,在这种情况下,这不是问题。


更进一步

您可以通过切换两个参数 xy 来进一步概括您的 sum-of-squares 函数来处理多个参数一个集合。

(defn sum-of-squares [& xs]
(reduce + (map #(* % %) xs)))

上面的函数创建了一个匿名函数,使用#() short hand syntax , 平方数。然后使用 map 延迟映射该函数, xs 集合中的每一项。因此,[1 2 3] 将变为 (1 4 9)reduce函数获取每个项目并将 + 函数应用于它和当前总数,从而生成集合的总和。 (因为 + 有多个参数,在这种情况下你也可以使用 apply 。)

如果使用线程宏之一将它们放在一起,->> ,它开始看起来非常平易近人。 (虽然,可以说,在这种情况下,我已经用一些可组合性换取了更多的可读性。)

(defn super-sum-of-squares [n numbers]
(->> (sort > numbers)
(take n)
(map #(* % %))
(reduce +)))

(super-sum-of-squares 2 [2 3 4]) ;;=> 25


关于clojure - 从具有 Clojure 和可读性问题的其他函数传递多个参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com