使Clojure let语句更具功能性

发布自我

在我的第一个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块中的状态。我基本上是先计算破损标志的数量,然后再计算可固定标志的数量。如果任何符号不能固定,我将打印-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块中进行计数。在错误的输入下输出-1也不是函数的工作,而只是任务的一部分。

泰勒·伍德

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

(let [broken (->> (:symbols field)
                  (map make-sign)
                  (filter broken?))
      unfixable (remove fixable? broken)]
  (when (seq unfixable)
    (- (count broken) (count unfixable))))
  • 您可以替换filter (complementremove
  • 可以pos?代替(> n 0)
  • 我会放了两个printlnS的内部的if,但实际上它是更好的返回值
  • 您可以内联broken-count绑定,因为它仅在一个地方使用
  • 我个人认为,使用更少的线程宏更容易阅读
  • 由于需要计算unfixables处于有条件,你可以测试与价值seq第一
  • 如果您-1以哨兵值返回,我会nil改用;when不满足条件时自然会发生
  • 有条件的逻辑似乎倒退:你回来-1的时候unfixable-count是正的,只有当它不是正使用它的值(这是该装置零B / C数不能为负),例如,它可以被改写为(- broken-count 0)公正,然后broken-count

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章