2009-12-15 16 views
7

मैं count down game पर इस हैकेल व्याख्यान पर जा रहा हूं, मुझे किसी भी हैकेल को नहीं पता लेकिन मैं समस्या में घुसपैठ कर रहा हूं, मैं अपने कोड को क्लोजर पर बंद करने की कोशिश कर रहा हूं।क्लोजर के लिए हास्केल

इस

, भाग मैं कुछ मैं हास्केल में नहीं मिलता होना चाहिए अटक गया है


split    :: [a] -> [([a],[a])] 
split []    = [([],[])] 
split (x:xs)   = ([],x:xs) : [(x:ls,rs) | (ls,rs) [([a],[a])] 
nesplit    = filter ne . split 

ne     :: ([a],[b]) -> Bool 
ne (xs,ys)   = not (null xs || null ys) 

exprs    :: [Int] -> [Expr] 
exprs []    = [] 
exprs [n]    = [Val n] 
exprs ns    = [e | (ls,rs)

मैं अपने खुद के विभाजन को देखते हुए 1 2 3 4 इसे बाहर थूक है,

(((1) (2 3 4)) ((1 2) (3 4)) ((1 2 3) (4))) 

(defn split [v] 
    (if (= (count v) 1) 
    (list (first v)) 
    (map #(list (take % v) (drop % v)) (range 1 (count v))))) 

(defn exprs [v] 
    (if (= (count v) 1) 
    v 
    (map #(concat (exprs (first %)) (exprs (second %))) v))) 

(exprs (split [1 2 3 4])) 

है कि मुझे देता है,

java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer 

कर सकते हैं एक nyone मुझे बताओ कि मैं हैकेल कोड से क्या याद कर रहा हूँ?

उनकी पूर्ण कोड लिस्टिंग here उपलब्ध है।

+0

क्या आपके हास्केल कोड की अंतिम पंक्ति एक समापन वर्ग गुम है ब्रैकेट? –

+1

मैंने यहां एक ही समस्या को देखा, हालांकि ग्राहम हटन के सुरुचिपूर्ण समाधान की तरह अधिक बलवान बल। देखें http://www.fatvat.co.uk/2009/02/countdown.html –

+0

बहुत धन्यवाद जेफ, मैं वैसे भी ब्रूट फोर्स विधि की कोशिश कर रहा था। –

उत्तर

4

यह बारीकी से हास्केल कार्यान्वयन पीछा कर रहा है जहाँ तक मेरी सीमित हास्केल फू के रूप में मुझे करने की अनुमति देता ....

(defn split 
    [s] 
    (map #(split-at % s) (range 1 (count s)))) 

(defn ne 
    [s] 
    (every? (complement empty?) s)) 

(defn nesplit 
    [s] 
    (filter ne (split s))) 

(declare combine) 

(defn exprs 
    [s] 
    (when-let [s (seq s)] 
    (if (next s) 
     (for [[ls rs] (nesplit s) 
      l  (exprs ls) 
      r  (exprs rs) 
      e  (combine l r)] 
     e) 
     s)))

हालांकि यह परीक्षण नहीं किया है।

आपके त्रुटि संदेश के लिए: मुझे लगता है कि समस्या यह है कि आप exprs में split को दोबारा कॉल नहीं करते हैं। तो फिर तुम मिल 1 गया एक दृश्य की उम्मीद है ...

रैंडम अन्य ध्यान दें: count दृश्यों के लिए समय में रेखीय है। चूंकि हमें केवल यह जानने की जरूरत है कि हमारे पास एक से अधिक तत्व हैं, हम nil के विरुद्ध (next s) के मान की जांच कर सकते हैं।

+0

वैसे भी: हम 'स्प्लिट' में वैसे भी 'गिनती' कहते हैं। अत: कोई बात नहीं। – kotarak

4

exprs को अपरिवर्तनीय रूप से बुलाया जाने वाला अपवाद परिणाम और अंततः पूर्णांक की सूची के साथ बुलाया जा रहा है। आपका कोड केवल सूचियों की सूची या लंबाई की एक सूची को संभालता है।

(concat (exprs (first 2)) (exprs (second 2))) 
(concat (exprs (first 3)) (exprs (second 3))) 
(concat (exprs (first 4)) (exprs (second 4))) 

और (पहले 2) फेंकता है:

(map #(concat (exprs (first %)) (exprs (second %))) '(2 3 4)))) 

जो करने के लिए बाहर आता है:

(exprs '(2 3 4)) 

किसी और जो करने के लिए बाहर का विस्तार अगर बयान की शाखा की ओर जाता है

java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer 
संबंधित मुद्दे