2012-11-21 18 views
7

मैं एक हास्केल नौसिखिया हूं इसलिए मुझे उस मामले में कुछ मूलभूत माफ़ी याद आ रही है, लेकिन मुझे यह नहीं पता कि निम्नलिखित कोड में क्या गलत है और यह ढेर क्यों बहती है। यह सबसे छोटी संख्या को खोजने के लिए है जो [1..x] में सभी संख्याओं द्वारा समान रूप से विभाजित है, यहां [1,2] का उपयोग कर रहा है (प्रोजेक्ट यूलर Problem 5 [1..20] के लिए है)।बहुत सरल कोड में ओवरफ़्लो ढेर

module Main where 

main::IO() 
main = do 
    putStrLn $ show s where s = func 1 

func :: Int -> Int 
func x 
    | foldr1 (&&) [x `mod` y == 0 | y <- [1..2]] == True = x 
    | otherwise = func x+1 

मुझे लगता है कि इसे '2' प्रिंट करना चाहिए।

मैंने पहले गार्ड के बजाय and [mod x y == 0 | y <- [1..2]] == True = x का उपयोग करने का भी प्रयास किया। दोनों मामलों में मुझे इसे चलाने की कोशिश करते समय एक स्टैक ओवरफ़्लो मिल रहा है। मैंने सबकुछ मुख्य रूप से एक और सूची समझ में डालकर समस्या हल कर ली है, लेकिन मैं समझना चाहता हूं कि इस के साथ क्या गलत है। धन्यवाद!

+2

आप '== True' को छोड़ सकते हैं। – Franky

उत्तर

14

समस्या (या कम से कम, एक समस्या --- मैं दूसरों के लिए जांच न की हो) इस पंक्ति में है:

| otherwise = func x+1 

आप का इरादा इस

| otherwise = func (x+1) 

हो सकता है लेकिन यह करने के लिए

| otherwise = (func x)+1 

फ़ंक्शन एप्लिकेशन किसी भी ऑपरेटर की तुलना में अधिक प्राथमिकता है।

+1

वास्तव में बहुत धन्यवाद, जिसने इसे हल किया। यह पाइथन से हास्केल तक एक फिसलन सड़क है! –

संबंधित मुद्दे