使Clojure-let语句更具功能性
在我的第一个Clojure项目中,除了最后的这一部分外,一切都很顺利:使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
(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
- 您可以内联
绑定,因为它只在一个位置使用中断计数
- 我个人认为,使用更少的线程宏更容易阅读
- 由于计数
s的需要是有条件的,因此可以先使用unfixable
测试值seq
- 如果将
作为哨兵值返回,我将使用-1
;当nil
条件不满足时,这会自然发生
- 条件逻辑似乎是反向的:当
为正时,返回不可调整计数
,并且仅在不为正时使用其值(这意味着它的零b/c计数不能为负),例如,可以将其重写为-1
,然后只使用(-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)))