2012-03-16 16 views
5

नहीं है इसलिए मैं Problem 31 पर काम कर रहा हूं।फ़ंक्शन `(y * y) <x 'दो तर्कों पर लागू होता है, लेकिन इसके प्रकार' बूल 'में

मैं उम्मीद निर्धारित करने के लिए निम्नलिखित समारोह लिखा है, इसकी एक नंबर एक प्रमुख है:

isPrime :: Integer -> Bool 

isPrime x = prime x 2 
      where 
      prime :: Integer -> Integer -> Bool 
      prime x y | ((y*y) < x) and ((x `mod` y) /= 0) = prime x (y+1) 
         | ((y*y) >= x) = True 
         | otherwise = False 

मेरे तर्क एक isPrime कार्य करना है, और 2 पैरामीटर, स्टोर करने के लिए isPrimeprime कहा जाता है के भीतर एक कार्य हो रहा था संख्या मैं यह देखने के लिए जांचना चाहता हूं कि यह प्राइम (x) है और x के sqrt से नीचे की सभी संख्याओं को जांचने के लिए एक पुनरावर्तक है और देखें कि क्या वे x विभाजित करते हैं।

| ((y*y) < x) and ((x `mod` y) == 0) = prime x (y+1) 

इस लाइन का कहना है कि माना जाता है: prime 3 गार्ड है संख्या मैं एक्स (((y*y) < x)) का वर्गमूल से भी कम समय से पारित कर दिया और अगर यह होता है की जाँच x से विभाज्य है अगर y (((x आधुनिक y) /= 0)) , यदि यह नहीं है तो मैं उच्च संख्या के साथ फिर से जांचने के लिए रिकर्सन और वृद्धि वाई का उपयोग करता हूं।

यह पंक्ति:

| ((y*y) >= x) = True 

की तरह अगर वर्गमूल नीचे सभी नंबरों को किसी भी प्रकार से एक्स विभाजित न करना माना जाता है, एक्स प्रधानमंत्री होना चाहिए।

अंत में, इस लाइन:

| otherwise = False 

मतलब यह है कि एक नंबर कहीं रेखा के साथ एक नंबर विभाजित एक्स तो यह प्रधानमंत्री नहीं है।

मैंने सोचा कि मैंने जो कोड लिखा है, वह मुझे समझ में आया है, मुझे पता है कि यह सबसे कुशल नहीं है, क्योंकि मैं केवल एसकर्ट एक्स के नीचे प्राइम देख सकता हूं और एसकर्ट एक्स के नीचे की सभी संख्या नहीं, लेकिन वैसे भी, मुझे इसके साथ समस्याएं आ रही हैं बयान:

((y*y) < x) 

GHCi का कहना है:

The function `(y * y) < x' is applied to two arguments, but its type `Bool' has none 

मैंने सोचा था कि < दो तर्क में लेने के लिए और एक बूल, त्रुटि संदेश वास्तव में मेरे लिए कोई मतलब नहीं है वापस जाने के लिए चाहिए था। क्या आप मुझे यह समझने में मदद कर सकते हैं कि मैं क्या गलत कर रहा हूं? धन्यवाद।

अब त्वरित संपादन मैं इसे चलाने के लिए मिल गया है कि, इस लाइन:

| ((y*y) >= x) = True 

होना चाहिए:

| ((y*y) > x) = True 

उत्तर

10

यह समझाने के लिए कि यहां क्या हो रहा है ...समस्या < साथ नहीं है, यह पूरे अभिव्यक्ति के साथ है:

((y*y) < x) and ((x `mod` y) /= 0) 

क्या आप भूल रहे हैं and आसपास बैकटिक है:

((y*y) < x) `and` ((x `mod` y) /= 0) 

आप ऐसा एक समारोह इन्फ़िक्स का उपयोग करते हैं, अगर यह एक ऑपरेटर नहीं है (यानि ++ जैसे प्रतीकों से बना), तो आपको इसे बैकटिक्स से घिरा होना चाहिए।

वैकल्पिक रूप से, आप इसे एक समारोह के रूप गैर इन्फ़िक्स उपयोग कर सकते हैं, जैसे:

and ((y*y) < x) ((x `mod` y) /= 0) 

अब त्रुटि संदेश को समझाने के लिए। कंपाइलर क्या कह रहा है कि आप एक समारोह के रूप में ((y*y) < x) अभिव्यक्ति का उपयोग करने का प्रयास कर रहे हैं। चूंकि हास्केल में फ़ंक्शन एप्लिकेशन ब्रैकेट का उपयोग नहीं करता है, f x y जैसी कोई भी फ़ंक्शन f दो तर्क x और y पर लागू होती है।

जब से तुम and आसपास बैकटिक डाल करने के लिए भूल गया, हास्केल ((y*y) < x) and ((x `mod` y) /= 0) की व्याख्या के रूप में आप तर्क and और ((x `mod` y) /= 0) को समारोह ((y*y) < x) लागू करने के लिए कोशिश कर रहा। बेशक, यह काम नहीं करता है, क्योंकि ((y*y) < x)Bool देता है, जो एक फ़ंक्शन नहीं है, इसलिए यह शिकायत करता है कि "फ़ंक्शन (y * y) < x दो तर्कों पर लागू होता है, लेकिन इसके प्रकार Bool में कोई भी नहीं है"। Bool फ़ंक्शन प्रकार नहीं है, और इसलिए इसमें कोई तर्क नहीं है। है and टाइप [Bool] -> Bool -

...

बेशक

, अन्य त्रुटि जो अब आपके पास यह होना चाहिए && नहीं and है।

+2

उर्फ। किसी को पता है कि एसओ पर बैकटिक्स के अंदर बैकटिक्स कैसे शामिल करें? मैं उनसे बचने के लिए प्रतीत नहीं कर सकता। – porges

+7

'&&' 'लॉजिकल और "के लिए फ़ंक्शन है, जिसमें' बूल -> बूल -> बूल 'टाइप किया गया है। 'और 'टाइप' [बूल] -> बूल 'के साथ एक समान कार्य है, इसलिए इसके चारों ओर बैकटिक्स डालने से यहां कोई मदद नहीं होगी। – Ben

+0

@Porges: आपके लिए तय किया गया है। जहां तक ​​मुझे पता है, आपको बैकस्लैश-एस्केक्ड बैकटिक्स के साथ '...' का उपयोग करने की आवश्यकता है। –

10

मुझे लगता है कि आप && बजाय and उपयोग करने के लिए मतलब है। ऐसा करने के बाद यह बिना किसी त्रुटि के लोड करता है।

+0

ईश्वर की मां अब यह चलती है। मैं अपने सिर को खरोंच कर रहा हूं कि यह बिल्ली क्यों काम नहीं करता है, मुझे आश्चर्य है कि यह मुझे कुछ नहीं देता है जैसे 'और' पहचान नहीं है या ऐसा कुछ नहीं है। ओह, साइड नोट मैंने अपने एल्गोरिदम में थोड़ी सी त्रुटि की: '| ((वाई * वाई)> = एक्स) = सही' होना चाहिए: '| ((वाई * वाई)> एक्स) = सही' – Dair

+1

@anon: 'और' एक समारोह भी है, लेकिन यह कुछ और करता है। – porges

+2

@anon: 'और' पहचाना जाता है - यह सिर्फ यह है कि यह एक इंफिक्स ऑपरेटर नहीं है। 'और' एक ऐसा फ़ंक्शन है जो एक सूची लेता है और लौटाता है कि उस सूची के सभी तत्व 'सत्य' हैं या नहीं। हास्केल ने क्या सोचा था कि आप 'और' फ़ंक्शन के तर्क के साथ फ़ंक्शन '(y * y) icktoofay

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