Clojure循环/重复模式,不好用吗?

标签 clojure

我正在学习Clojure,并且正在使用4Clojure
作为一种资源。我可以解决网站上的许多“简单”问题,但是对我来说,以函数式编程的思维方式思考仍然不是自然而然的(我来自Java)。结果,我在大多数seq构建实现中都使用了循环/递归迭代模式,因为这就是我习惯的思维方式。

但是,当我查看经验丰富的Clojure用户的答案时,他们会以更加实用的方式进行操作。例如,in a problem about implementing the range function,我的回答是:

(fn [start limit]
  (loop [x start y limit output '()]
    (if (< x y)
      (recur (inc x) y (conj output x))
      (reverse output))))

在执行此操作的同时,其他用户执行了以下操作:
(fn [x y] (take (- y x) (iterate inc x)))
我的功能比较冗长,我什至不知道“迭代”功能是否存在。但是从效率的角度来看,我的回答是否更糟?循环/重复使用是否比替代方法更差?我担心这种事情将来会在我身上发生很多,因为还有很多我不知道的函数,例如迭代。

最佳答案

第二个变体返回一个惰性序列,该序列实际上可能更有效,尤其是在范围较大的情况下。

另一件事是第二种解决方案更好地传达了这一想法。换句话说,它描述了意图而不是实现。与您的代码相比,您需要花费更多的时间来理解它,而您的代码则必须通读循环主体并在脑海中构建控制流模型。

关于新功能的发现:是的,您可能事先不知道已经定义了某些功能。比方说,在Haskell中,您可以通过类型签名来搜索函数,这很容易,但是通过一定的经验,您将学会识别这样的函数编程模式。您将像第二个变体一样编写代码,然后在标准库中查找类似于takeiterate的代码。

关于Clojure循环/重复模式,不好用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641902/

相关文章:

macros - Clojure 简单模式匹配

Clojure/Noir : Force HTTPS, 如果请求是 http://到 https://则重定向

clojure - 如何遍历一个集合并在每次迭代中访问上一个,当前和下一个值?

clojure - 如何从 Clojure 错误中获得更好的反馈?

clojure - 为什么 Clojure 中的这两个函数有不同的输出?

java - leiningen 无法运行,因为 java class not found 异常

macros - 如何向类 defn 的 Clojure 宏添加文档字符串支持?

java - 在 Clojure 中调用不带参数的 Java 实例方法

clojure - 当您在 Clojure REPL 中键入 "hello, world"时,为什么会显示 'nil' ?

clojure - 如何使用 `clojure.spec/+` 限制生成样本的大小?