Clojure - 功能还是缺点?

时间:2013-10-27 13:17:09

标签: clojure fibonacci

好的,Clojure中的斐波那契函数:

(defn give-fibs []                                                                                                                                                              
    ((fn fib-seq [a b]                                                                                                                                                            
        (cons a (lazy-seq (fib-seq b (+ a b)))))                                                                                                                                   
    0 1))

现在,我的问题是,当我这样称呼它时,我收到一个错误:

(take 10 give-fibs)

编辑,错误是 - java.lang.IllegalArgumentException: Don't know how to create ISeq from: four_cloj.core$give_fibs

然而,当我打电话时它会起作用:

(take 10 (give-fibs))

当我查看发生了什么事时,我无法解释它:

(class (give-fibs)) ; clojure.lang.Cons
(class give-fibs)   ; four_cloj.core$give_fibs

...

3 个答案:

答案 0 :(得分:2)

give-fibs就是这个 - 功能本身。函数作为可以传递的值的概念(例如,作为take的参数)需要一些人习惯,但这是完全合理和正常的。

(give-fibs)是调用没有参数的give-fibs的结果,这是您在此上下文中所需的。结果是一个列表,列表的每个元素都是Cons对象,这是class告诉你的。

答案 1 :(得分:1)

在此表达式中,您实际上并未调用give-fibs

 (take 10 give-fibs)

你只需将函数本身传递给take。你想要的是实际调用give-fibs以便将结果传递给take

(take 10 (give-fibs))

答案 2 :(得分:1)

请记住,s表达式中的第一个元素被认为是在函数位置,也就是说它将被执行。因此give-fibs(give-fibs)的不同之处在于前者是传递给take的实际函数,而后者是调用该函数,因此返回结果传递给{{1 }}

这就是为什么take是一个函数,而(class give-fibs)是一个预期的Cons单元格。

只需记住开始括号位于功能位置后的第一个变量并将被执行,它完全有效,可将未执行的功能传递给另一个。