2013-03-07 85 views
1

在clojure中完全没有经验,并且自大学以来没有任何函数式编程习惯,我试图解释一些示例代码来找出clojure语法。Clojure矢量作为函数参数

我开始编码斐波那契(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]))))) 

我竭力要真正理解这个代码的最深处:

fn [[a b]] [b (+ a b)] 

现在,从我的理解,我们创建了一个匿名函数接收一个参数,一个具有两个值的向量(这是解构,对吗?),并返回另一个向量。

现在,什么是我们可以做到这一点的原因,而不是:

fn [a b] [b (+ a b)] 

这些是相同呢?或者我们只是让我们的匿名函数接收一个参数作为在iterate中使用的“噱头”?

对不起,如果这是完全明显的,但正如我所说,类似Lisp的语言不是我的强项。

回答

10

你已经自己想清楚了。

(fn [[a b]] ...)形式的函数正在使用解构。它需要一个参数,该参数应该是支持clojure的nth函数的向量或其他类型的对象。使用解构,它将前两个值“拉出”向量,并将它们分配给局部变量ab

(fn [a b] ...)形式的函数是两个参数的函数。这两个不相同。

您必须使用(fn [[a b]] ...)表格与iterate的原因是iterate仅适用于单参数功能。

+1

接受更详细的解释。此外,*向量的前两个值使我意识到,如果我通过一个更多的元素,其余的将被忽略,我不知道!尼斯。 – pcalcao 2013-03-07 13:50:24

1

这是因为迭代只需要两个参数,即一个函数和一个参数。 cf. the docs