2012-11-11 30 views
12

के अंदर गार्ड के साथ एक फ़ंक्शन को परिभाषित करना मैं अपने आप को हास्केल को पढ़ाने के लिए शुरू कर रहा हूं। इस कोड को प्रधानमंत्री गुणनखंड क्या करना चाहिए है:हास्केल - 'कहाँ'

divides :: Integer -> Integer -> Bool 
divides small big = (big `mod` small == 0) 

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

primeFactors :: Integer -> [Integer] 
primeFactors 1 = [] 
primeFactors n 
    | n < 1 = error "Must be positive" 
    | otherwise = let m = lowestDivisor n 
        in m:primeFactors (n/m) 

मैंने टिप्पणी की लाइन पर एक पार्स त्रुटि मिलता है। मुझे लगता है कि मेरी समस्या यह हो सकती है कि lowestDivisorHelper में गार्ड हैं, लेकिन संकलक यह नहीं जानता कि गार्ड lowestDivisorHelper या lowestDivisor से संबंधित हैं या नहीं। मैं इसके आसपास कैसे पहुंचू?

संपादित करें: मुझे यह जोड़ना चाहिए कि मैं कार्यान्वयन विस्तार को छिपाने के लिए शीर्ष स्तर पर सहायक कार्य को परिभाषित नहीं करना चाहता था। फ़ाइल को आयात करना इसके साथ सहायक कार्य नहीं लेना चाहिए।

+3

"फ़ाइल आयात करने से इसके साथ सहायक कार्य नहीं करना चाहिए।" इस मामले में, बस इसे निर्यात न करें। –

उत्तर

16
lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n where 
    lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

आपको गार्ड द्वारा तुलना के लिए पर्याप्त रूप से इंडेंट होने के लिए अपने सहायक कार्य के साथ एक नया बयान शुरू करने की आवश्यकता है। (। और तुम भी एक तर्क, n भूल गया) यह भी होगा काम:

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where 
    lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

लेकिन यह नहीं करता है:

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

प्रमुख मुद्दा है कि | के लिए आगे हो गया है है फ़ंक्शन नाम से दाएं।

सामान्य रूप से, एक नई लाइन शुरू करने से पहले तक यह सही होता है जब तक कि यह सही हो। गार्ड को फ़ंक्शन नाम से जारी रखना होगा।

+0

आह, मैं सिर्फ एक टिप्पणी लिख रहा था कि आपका आखिरी उदाहरण ठीक था। – Vitus