由于完全缺乏clojure经验,并且自大学以来没有任何函数式编程实践,我试图解释一些示例代码来找出clojure语法.
我开始编写几个版本的Fibonacci(https://gist.github.com/pcalcao/ea4176719d778ea3ab9e),但我仍然不能说我完全理解更复杂的形式.
例如,这个:
(defn fib_map [n]
(last (take (+ n 1)
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))))
Run Code Online (Sandbox Code Playgroud)
我很难真正理解这段代码的最内层部分:
fn [[a b]] [b (+ a b)]
Run Code Online (Sandbox Code Playgroud)
现在,根据我的理解,我们正在创建一个匿名函数,它接收一个参数,一个带有两个值的向量(这是解构,对吧?),然后返回另一个向量.
现在,我们这样做的原因是什么,而不是:
fn [a b] [b (+ a b)]
Run Code Online (Sandbox Code Playgroud)
这些是等价的吗?或者我们只是简单地让我们的匿名函数接收一个参数作为"噱头"来使用iterate?
对不起,如果这是非常明显的,但就像我说的那样,类似Lisp的语言还不是我的强项.
mty*_*aka 11
你已经自己弄清楚了.
表单的功能(fn [[a b]] ...)是使用解构.它需要一个参数,它应该是一个向量或另一种支持clojure nth函数的对象.使用解构,它将前两个值"拉"出向量并将它们分配给局部变量a和b.
表单(fn [a b] ...)的功能是两个参数的函数.这两者并不相同.
您必须使用(fn [[a b]] ...)表单的原因iterate是iterate只适用于单参数函数.
| 归档时间: |
|
| 查看次数: |
2598 次 |
| 最近记录: |