0

好的,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

??

4

3 回答 3

2

give-fibs就是这样 - 功能本身。函数作为可以传递的值的概念(例如,作为 的参数take)需要一些时间来适应,但它是完全明智和正常的。

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

于 2013-10-27T13:21:29.537 回答
1

在这个表达式中,你并没有真正调用give-fibs

 (take 10 give-fibs)

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

(take 10 (give-fibs))
于 2013-10-27T13:20:25.627 回答
1

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

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

只需记住左括号后的第一个 var 位于函数位置并将被执行,并且将未执行的函数传递给另一个函数是完全有效的。

于 2013-10-27T16:36:50.860 回答