gpt4 book ai didi

clojure - 使 Clojure let 语句更具功能性

转载 作者:行者123 更新时间:2023-12-02 06:13:17 25 4
gpt4 key购买 nike

在我的第一个 Clojure 项目中,除了最后的这一部分,一切都很顺利:

(let [broken-signs    (->> (:symbols field)
(map make-sign)
(filter broken?))
broken-count (count broken-signs)
unfixable-count (-> (filter (complement fixable?) broken-signs)
(count))]
(println
(if (> unfixable-count 0)
-1
(- broken-count unfixable-count))))

缩进看起来不对,而且感觉不实用,因为我在 let block 中重用状态。我基本上先数一下损坏的标牌数量,然后再数可修复标牌的数量。如果任何符号不可修复,我打印 -1,否则我打印要修复的符号数。

如果我映射/过滤两次,我就会有重复的代码,但最重要的是它会运行得更慢。尽管如此,是否有改进此代码的方法?

编辑:这就是我的决定

 (defn count-broken-yet-fixable []
(let [broken (->> (:symbols field)
(map make-sign)
(filter broken?))
unfixable (remove fixable? broken)]
(when (empty? unfixable)
(count broken))))

(defn solve-task []
(if-let [result (count-broken-yet-fixable)]
result
-1))

(println (solve-task))

减法确实没有必要,计数也不必发生在 let block 中。在输入错误时输出 -1 也不是函数的工作,只是任务的一部分。

最佳答案

我认为您的方法没有任何“非功能性”或错误。缩进看起来不错。

(let [broken (->> (:symbols field)
(map make-sign)
(filter broken?))
unfixable (remove fixable? broken)]
(when (seq unfixable)
(- (count broken) (count unfixable))))
  • 您可以将 filter (complement 替换为 remove
  • 可以使用 pos? 代替 (> n 0)
  • 我可能会在 if 中放置两个 println,但实际上最好还是返回一个值
  • 您可以内联 broken-count 绑定(bind),因为它只用在一个地方
  • 我个人认为使用较少的线程宏会更容易阅读
  • 由于需要对unfixable 进行计数是有条件的,因此您可以先使用seq 测试值
  • 如果您返回 -1 作为标记值,​​我会使用 nil 代替;当 when 条件不满足时,这自然会发生
  • 条件逻辑似乎是倒退的:当 unfixable-count 为正数时,您返回 -1 ,并且仅在它不是正数时才使用它的值(这意味着它为零 b/c 计数不能为负数),例如它可以重写为 (- broken-count 0) 然后只是 broken-count

关于clojure - 使 Clojure let 语句更具功能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54450231/

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