繁体   English   中英

Clojure矢量作为函数参数

[英]Clojure vector as function parameter

由于完全缺乏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])))))   

我很难真正理解这段代码的最内层部分:

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

现在,根据我的理解,我们正在创建一个匿名函数,它接收一个参数,一个带有两个值的向量(这是解构,对吧?),然后返回另一个向量。

现在,我们这样做的原因是什么,而不是:

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

这些是等价的吗? 或者我们只是让我们的匿名函数接收一个参数作为iterate使用的“噱头”?

对不起,如果这是非常明显的,但就像我说的那样,类似Lisp的语言还不是我的强项。

你已经自己弄清楚了。

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

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

你必须在iterate使用(fn [[ab]] ...)形式的原因是iterate仅适用于单参数函数。

这是因为迭代只需要两个参数,即一个函数和一个参数。 比照 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM