1) समस्या यह है कि sqrt
में (Floating a) => a -> a
है, लेकिन आप एक इंटीजर को तर्क के रूप में उपयोग करने का प्रयास करते हैं। तो आपको अपने इंटीजर को फ़्लोटिंग में पहले कनवर्ट करना होगा, उदा।sqrt (fromIntegral x)
2) लिख कर मैं कोई कारण नहीं क्यों == आलसी नहीं होना चाहिए देखते हैं, लेकिन एक खाली संग्रह के लिए परीक्षण के लिए आप, null
समारोह (जो निश्चित रूप से आलसी है उपयोग कर सकते हैं के रूप में यह अनंत सूची पर काम करता है):
isPrime :: Integer->Bool
isPrime x = null [y | y<-[2..floor (sqrt (fromIntegral x))], x `mod` y == 0]
लेकिन अधिक मूर्खतापूर्ण समाधान प्राप्त करने के लिए, समस्या को छोटी उप-समस्याओं में विभाजित करें। सबसे पहले, हम y * y के साथ y सभी तत्वों की सूची की जरूरत < = एक्स:
filter (\y -> x `mod`y == 0) (takeWhile (\y -> y*y <= x) [2..])
फिर हम उस सूची अगर जांच करने की आवश्यकता:
takeWhile (\y -> y*y <= x) [2..]
फिर हम केवल तत्वों है कि एक्स विभाजित की जरूरत है रिक्त है:
isPrime x = null (filter (\y -> x `mod`y == 0) (takeWhile (\y -> y*y <= x) [2..]))
और अगर यह आपके लिए lispy को लग रहा है, $
isPrime x = null $ filter (\y -> x `mod` y == 0) $ takeWhile (\y -> y*y <= x) [2..]
0 के साथ कोष्ठक में से कुछ की जगह अतिरिक्त स्पष्टता के लिए
आप lambdas "आउटसोर्स" कर सकते हैं:
isPrime x = not $ any divisible $ takeWhile notTooBig [2..] where
divisible y = x `mod`y == 0
notTooBig y = y*y <= x
अंतिम घोषणा सभी संख्याओं के लिए 2 से अधिक या बराबर के लिए काम करती है। 1 के लिए यह गलत कहता है कि यह प्राइम है, क्योंकि 1 प्राइम नहीं है। – Elmex80s