好的,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
...
答案 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单元格。
只需记住开始括号位于功能位置后的第一个变量并将被执行,它完全有效,可将未执行的功能传递给另一个。