2011-09-24 26 views
2

我嘗試編寫函數,如果元素存在於列表中,則返回true;否則返回false。Clojure列表成員轉換錯誤

我的代碼:

(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 

有什麼不對?我該如何解決它?

謝謝。

回答

5

看起來你來自一種語言,它比Clojure具有更廣泛的模式匹配;在Clojure中基本上是無稽之談。相反,只需測試ilist是否爲空。

還有一些其他錯誤的,所以這裏的,雖然是接近你打算什麼儘可能實際工作的一個片段:

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

+1了很好的答案,一個額外的一點是,我會建議在最後一行使用「recur」而不是「is_member」,因爲該函數是尾遞歸的,並且顯然可以從這種優化中受益。 – mikera

+0

+1,因爲我不懂Clojure的相關代碼! –