使Clojure-let语句更具功能性

使Clojure-let语句更具功能性,clojure,functional-programming,purely-functional,Clojure,Functional Programming,Purely Functional,在我的第一个Clojure项目中,除了最后的这一部分外,一切都很顺利: (let [broken-signs (->> (:symbols field) (map make-sign) (filter broken?)) broken-count (count broken-signs) unfixable-count (-> (fil

在我的第一个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,否则打印要固定的符号数

如果我映射/过滤两次,我会有重复的代码,但最重要的是它会运行得更慢。然而,有没有办法改进此代码

编辑:这就是我决定的
减法确实没有必要,计数也不必在let块中进行。在输入错误时输出-1也不是函数的工作,只是任务的一部分。

您的代码没有副作用(打印除外,我们将对此进行修复),因此我不会说它没有功能
let
用于建立中间值。评论中有一些潜在的改进

;此处对齐(有争议)
(让[断开的符号(->>(:符号字段)
(地图制作标志)
(过滤器坏了吗?)
计数中断(计数中断符号)
不可调整计数(->>虚号;可能强调非功能启动
(过滤器(补码固定?)
计数);不需要参数
不打印,只返回号码
(如果(<0不可调整计数);首选少于(Clojure书籍的元素)
-1
(-中断计数不可调整计数)))

我强烈建议您提供相关建议。

我不认为您的方法有任何“不实用”或错误。凹痕看起来很好

(let [broken (->> (:symbols field)
                  (map make-sign)
                  (filter broken?))
      unfixable (remove fixable? broken)]
  (when (seq unfixable)
    (- (count broken) (count unfixable))))
  • 您可以用
    删除
  • 可以使用
    pos?
    而不是
    (>n0)
  • 我可能会将两个
    println
    放在
    if
    中,但实际上最好返回一个值
  • 您可以内联
    中断计数
    绑定,因为它只在一个位置使用
  • 我个人认为,使用更少的线程宏更容易阅读
  • 由于计数
    unfixable
    s的需要是有条件的,因此可以先使用
    seq
    测试值
  • 如果将
    -1
    作为哨兵值返回,我将使用
    nil
    ;当
    条件不满足时,这会自然发生
  • 条件逻辑似乎是反向的:当
    不可调整计数
    为正时,返回
    -1
    ,并且仅在不为正时使用其值(这意味着它的零b/c计数不能为负),例如,可以将其重写为
    (-breaked count 0)
    ,然后只使用
    breaked count
您的代码已经非常整洁,布局也很好。我想做的唯一更改是尽可能长时间地留在域中-在本例中,
标记对象。并且只在很久以后使用计数


然后,返回值可以使用print来执行实际操作。

我认为这样看起来不错。我喜欢使用
let
块来标记中间变量。这可能应该是启用的。
(let [broken (->> (:symbols field)
                  (map make-sign)
                  (filter broken?))
      unfixable (remove fixable? broken)]
  (when (seq unfixable)
    (- (count broken) (count unfixable))))
(let [broken-signs (->> (:symbols field)
                        (map make-sign)
                        (filter broken?))]
  (if-let [unfixable-signs (seq (remove fixable? broken-signs))]
    -1
    (- (count broken-signs) (count unfixable-signs)))