【问题标题】:Clojure can't pass list to a function Error PersistentList cannot be cast to clojure.lang.IFnClojure 无法将列表传递给函数错误 PersistentList 无法强制转换为 clojure.lang.IFn
【发布时间】:2011-08-17 22:08:26
【问题描述】:

我有一些处理列表的函数。我有一个偶数函数,它接受一个列表参数并获取列表的偶数索引。奇函数做同样的事情,但索引奇数。我还有另一个合并两个排序列表的函数,称为合并列表,它接受两个列表作为参数。

问题出在我现在写的函数上:merge-sort。

这是我所拥有的:

(defn merge-sort [lis]
    (if (empty? (rest lis))
        lis
        (merge-list (merge-sort (odd(lis))) (merge-sort (even(lis))))))))

由于某种原因,我不断收到错误

java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.IFn

我可以像这样(odd(rest lis)) 传递奇函数rest lis(与偶数相同)。它运行良好,但这显然没有给我想要的解决方案。

我对 Clojure 非常陌生,因此我们将不胜感激任何提示。谢谢。

【问题讨论】:

  • 你为什么编辑你的代码?现在没有人可以从你的经验中学习。我会重新编辑它,但也许你有原因。
  • 你能发布你的代码吗?如果我们看不到您的代码,就很难准确判断您做错了什么。

标签: list clojure mergesort


【解决方案1】:

(odd lis)(even lis),而不是 (odd (lis))。您希望将其作为参数传递,而不是将其作为函数调用,然后传递结果。

【讨论】:

    【解决方案2】:

    当 Clojure 编译器遇到一个列表时,它会在列表的头部查找要调用的函数或宏。

    错误消息“FooClass cannot be cast to clojure.lang.IFn”通常意味着您在“函数位置”(列表的头部)有一个 FooClass 的实例,它既不是函数也不是宏。

    这通常是由语法错误或有问题的宏引起的。如果像 amalloy 建议的那样,您将 list 参数用括号括起来,那么这就是问题所在。

    【讨论】:

    • 他曾经将代码包含在问题旁边,然后出于某种原因(显然是在我的回答之后和你的回答之前),他将其编辑掉了。
    • 对不起,我把它放回去了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多