【问题标题】:Clojure list member cast errorClojure 列表成员转换错误
【发布时间】:2011-09-24 17:45:24
【问题描述】:

我尝试编写函数,如果元素存在于列表中则返回 true,否则返回 false。

我的代码:

(defn is_member [elem ilist]
  ((elem []) false)
  (if (= elem (first (list ilist))) 
    (true)
    (is_member elem (rest (list ilist)))
  )
)

我尝试运行它:

(is_member 1 '(1,2,3,4))

但得到错误:

#<CompilerException java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn 

怎么了?我该如何解决?

谢谢。

【问题讨论】:

    标签: list function clojure


    【解决方案1】:

    看起来您来自一种比 Clojure 具有更广泛模式匹配的语言; ((elem []) false) 在 Clojure 中基本上是无稽之谈。相反,只需测试ilist 是否为空。

    还有许多其他错误,所以这里有一个 sn-p 实际工作,同时尽可能接近您的预期:

    (defn is_member [elem ilist]
      (cond (empty? ilist) false
            (= elem (first ilist)) true
            :else (is_member elem (rest ilist))))
    

    【讨论】:

    • +1 是一个很好的答案,另外一点是我建议在最后一行使用“recur”而不是“is_member”,因为该函数是尾递归的,并且可以明显受益于这种优化。
    • 第一句+1,因为我看不懂Clojure的相关代码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    相关资源
    最近更新 更多