2014-08-28 21 views
1

剛開始學習Clojure時遇到100門問題。即時得到鑄造錯誤:嘗試將LazySeq投射到IFn時出錯

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

這裏是我的代碼:

(defn doors [n] 
    (loop [n n 
     acc (repeat n false)] 
    (if (= n 0) 
     (open-doors acc) 
     (do 
     (let 
      [yy (map-every-nth not acc n)] 
      (recur (dec n) (acc yy))))))) 


(defn map-every-nth [f coll n] 
    (map-indexed #(if (zero? (mod (inc %1) n)) (f %2) %2) coll)) 

(defn open-doors [d] 
    (for [doors d 
     n (iterate inc 0) 
     :when d] 
    n)) 

(doors 100) 
+0

PLZ隨意添加有關解決方案的意見。 – user3139545 2014-08-28 16:17:23

+3

在你打電話給''門',就好像它是一個函數。這不是你想要的。 – 2014-08-28 16:19:26

回答

3

記住的Clojure將嘗試執行每一個它遇到的列表:

(+ 1 2) 

這裏符號+是綁定來運行,因此表格(+ 1 2)成功執行。即使報價也不取消規則:

'(+ 1 2) => (quote (+ 1 2)) 

報價表格被執行並返回其內容作爲結果。因此,Clojure中每個列表的第一個元素必須是可執行的:符號綁定到宏或函數,或特殊的運算符。

在您的例子,我們看到:

(acc yy) 

acc是一個懶惰的序列中,(repeat n false)結果。它不能被執行,因此你會得到一個錯誤。

請注意,您的函數中存在遞歸調用,因此參數recur是函數的參數。在函數的Clojure參數中使用前進行評估。宏的論據不。

0

這裏是一個解決方案

(defn map-every-nth [f n coll] 
    (map-indexed 
    #(if (zero? (mod (inc %) n)) 
     (f %2) 
     %2) 
    coll)) 

(defn doors [] 
    (let [n 100] 
    (loop [p 1 
      state (repeat n false)] 
     (if (>= p 100) 
     state 
     (recur 
      (inc p) 
      (map-every-nth not p state)))))) 
相關問題