2011-09-10 7 views
23

मैं हास्केल में एक फ़ंक्शन कर रहा हूं जो केवल सूची में शाम को रोकता है और मुझे कोई समस्या आ रही है। जब मैं अनुपालन चलाता हूं तो यह शिकायत करता है कि आप एक int का विभाजन नहीं कर सकते हैं और मुझे एक अंशकालिक int प्रकार की घोषणा की आवश्यकता है। मैंने फ्लोट करने के लिए प्रकार की घोषणा को बदलने की कोशिश की है, लेकिन उसने अभी एक और त्रुटि उत्पन्न की है। मैंने नीचे फ़ंक्शन का कोड शामिल किया है और किसी भी प्रकार की सहायता की उम्मीद कर रहा था।हास्केल में डिवीजन

halfEvens :: [Int] -> [Int] 
halfEvens [] = [] 
halfEvens (x:xs) | odd x = halfEvens xs 
       | otherwise = x/2:halfEvens xs 

पढ़ने के लिए धन्यवाद।

+1

मुझे लगता है कि आप इस मामले में x 'div' 2 चाहते हैं। मैं किसी और को यह पुष्टि करने दूंगा कि मैं सही हूं (100% निश्चित नहीं हूं) और एक और पूर्ण स्पष्टीकरण दें। – MatrixFrog

उत्तर

31

उपयोग div, जो पूर्णांक विभाजन करता है:

halfEvens :: [Int] -> [Int] 
halfEvens [] = [] 
halfEvens (x:xs) | odd x = halfEvens xs 
       | otherwise = x `div` 2 : halfEvens xs 

(/) समारोह तर्क जिसका प्रकार आंशिक कक्षा में है की आवश्यकता है, और मानक विभाजन प्रदर्शन करती है। div फ़ंक्शन के लिए तर्क की आवश्यकता होती है जिसका प्रकार कक्षा इंटीग्रल में है, और पूर्णांक विभाजन करता है।

अधिक सटीक, div और mod नकारात्मक अनंतता की ओर गोल। उनके चचेरे भाई, quot और rem, integer division in C और शून्य की ओर व्यवहार करते हैं। div और mod आमतौर पर मॉड्यूलर अंकगणित करते समय सही होते हैं (उदाहरण के लिए सप्ताह के दिन की गणना करते समय), जबकि quot और rem थोड़ा तेज (मुझे लगता है) हैं। GHCi में थोड़ा के आसपास

बजाना:

> :t div 
div :: Integral a => a -> a -> a 
> :t (/) 
(/) :: Fractional a => a -> a -> a 
> 3/5 
0.6 
> 3 `div` 5 
0 
> (-3) `div` 5 
-1 
> (-3) `quot` 5 
0 
> [x `mod` 3 | x <- [-10..10]] 
[2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1] 
> [x `rem` 3 | x <- [-10..10]] 
[-1,0,-2,-1,0,-2,-1,0,-2,-1,0,1,2,0,1,2,0,1,2,0,1] 
+0

आपकी मदद के लिए बहुत बहुत धन्यवाद। – D347th

+0

हां, उद्धरण तेज़ है क्योंकि मशीन निर्देश क्या करता है। NS32k प्रोसेसर के अलावा, जिसमें दोनों प्रकार के विभाजन निर्देश थे। – augustss

+1

क्या ghc 2 की शक्ति से दाएं-शिफ्ट में विभाजन को अनुकूलित करता है? एन बिट्स की एक अंकगणित सही शिफ्ट 2 ** एन से विभाजित होगी, लेकिन यह नकारात्मक अनंतता की ओर बढ़ जाएगी (यदि आप सही शिफ्ट -1 करते हैं, तो आपको अभी भी -1 मिलता है)। 0 की ओर घूमने के लिए, यदि इनपुट स्थानांतरण से पहले नकारात्मक है तो आपको (2 ** n) -1 जोड़ना होगा। इस मामले में, 'div'' quot' – pat

0

मैं जोड़ने चाहिए कि map का उपयोग कर कोड को आसान बनाने में होता है।

HalfIfEven n 
    | even n = n `div` 2 
    | otherwise = n 

halfEvens = map halfIfEven 
+0

लेकिन यह आपको एक ही परिणाम नहीं देता है। मूल कोड बाधाओं को हटा देता है, तुम्हारा नहीं है। सरलतम शायद 'आधावेन = नक्शा (\' div \ '2) होगा। फ़िल्टर भी ' – semicolon