【问题标题】:Clojure vector as function parameterClojure 向量作为函数参数
【发布时间】:2013-02-22 17:21:03
【问题描述】:

由于对 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 的语言还不是我的强项。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    你自己已经猜对了。

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

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

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

    【讨论】:

    • 接受更详细的解释。此外,向量的前两个值让我意识到,如果我传递一个包含更多元素的 coll,其余的将被忽略,我不知道!不错。
    【解决方案2】:

    这是因为 iterate 只接受两个参数,即一个函数和一个参数。 cf. the docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多