Clojure 向量作为函数参数

标签 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 语言还不是我的强项。

最佳答案

你自己已经猜对了。

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

(fn [a b] ...) 形式的函数是两个参数的函数。两者不等价。

您必须将 (fn [[a b]] ...) 形式与 iterate 一起使用的原因是 iterate 仅适用具有单参数函数。

关于Clojure 向量作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15272403/

相关文章:

clojure - 我们可以更改数据枚举还是可以向数据枚举添加任何新值?

java - 如何在 Clojure 中导入位于单独文件中的嵌套 Java 类?

map - 将 seq 扩展为单个标量

dictionary - 有没有一种惯用的方法可以在 Clojure 的 map 中找到匹配的键和值?

clojure:在 "if"中删除重复的惯用方法?

map - Clojure 嵌套映射 - 更改值

clojure - 使用 Lein 和 Ring 在 Clojure 中丢失 *out*

algorithm - 在函数范式中实现 Karger 的最小割算法

haskell - 这个 Haskell 移动平均函数的 Clojure 等价物?

Clojure 中的 Hadoop - 从哪里开始?