【问题标题】:Clojure - function or cons?Clojure - 功能还是缺点?
【发布时间】:2013-10-27 13:17:09
【问题描述】:

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

??

【问题讨论】:

    标签: clojure fibonacci


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

       (take 10 give-fibs)
      

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

      (take 10 (give-fibs))
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-08-24
          • 1970-01-01
          • 2021-10-06
          • 2020-05-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-29
          • 2014-10-30
          • 2015-12-22
          相关资源
          最近更新 更多