2012-10-07 7 views
20

यह समारोह:अंक बनाम इंटीग्रल

hola :: (Integral a) => a -> String 
hola 1 = "OK" 
hola _ = "asdf" 

ठीक काम करता है। लेकिन इस एक:

hola :: (Num a) => a -> String 
hola 1 = "OK" 
hola _ = "asdf" 

संकलित नहीं किया जा सकता: "अनुमान नहीं किया जा सका (Eq क) शाब्दिक` 1 'से उत्पन्न होने वाली "

मैं वास्तव में यह नहीं मिलता है। मैं एक ट्यूटोरियल जहां यह कहा

"इंटीग्रल भी एक अंकीय typeclass है पढ़ रहा हूँ। Num वास्तविक संख्या और अभिन्न नंबर सहित सभी नंबरों को भी शामिल है, इंटीग्रल केवल अभिन्न (पूरे) संख्या भी शामिल है। इस typeclass में हैं इंट और पूर्णांक। " http://learnyouahaskell.com/types-and-typeclasses

मैं नम का उपयोग क्यों नहीं कर सकता?

उत्तर

27

यह आधार पैकेज के नवीनतम संस्करण में हाल ही में एक परिवर्तन proposed and accepted in September/October last year है,, Eq और Show नहीं रह गया है Num की सुपर-क्लास कर रहे हैं। उस परिवर्तन के बाद से, भाषा रिपोर्ट का कोई नया संस्करण प्रकाशित नहीं हुआ है, इसलिए यह अभी तक रिपोर्ट में नहीं है। और हाल ही में, इसने इसे अभी तक कई ट्यूटोरियल या किताबों में नहीं बनाया है।

एक संख्यात्मक शाब्दिक के खिलाफ "पैटर्न मिलान" (==) का एक निहित अनुप्रयोग है, इसलिए Eq उदाहरण के लिए काम करने की आवश्यकता है। उस उदाहरण को अब Num बाधा से अनुमानित नहीं किया जा सकता है, इसलिए (काफी नया: डी) कंपाइलर केवल Num बाधा के साथ कोड को अस्वीकार कर देता है।

लेकिन IntegralReal का एक उपवर्ग एक सुपर क्लास के रूप में जो Ord (और इसलिए Eq) है, है, इसलिए है कि काम करता है।

+0

पूर्वाग्रह संस्करण में काम करना :) धन्यवाद !! मुझे लगता है कि यह परिवर्तन इस भाषा को थोड़ा उलझन में डालता है .. :( – user1726613

+0

ठीक है, यह निश्चित रूप से संक्रमण अवधि में बहुत भ्रम (और पैकेजों का टूटना) का कारण बन जाएगा। लेकिन समग्र सर्वसम्मति यह थी कि लाभ हानि से अधिक है (पुरानी 'ईक 'और' शो' आवश्यकताओं को छोड़कर समझदार 'संख्या' उदाहरणों के बारे में ऐसी चीजों के लिए अधिक नकली' ईक' और 'शो' उदाहरण नहीं हैं। वही (mutatis mutandis) ' 'बिट्स' से न्यूम सुपरक्लास। सौभाग्य से, ब्रेकेज बाधाओं को जोड़कर _backward-compatibly_ तय किए गए हैं। –

+0

बहुत धन्यवाद डैनियल, आपके उत्तर बहुत उपयोगी थे। इसलिए नए कंपाइलर के साथ मुझे यह सुनिश्चित करना होगा कि बाधा में एक ईक शामिल है उदाहरण कम से कम तुलना करने के लिए उदाहरण। – user1726613

4

के रूप में डैनियल फिशर ने कहा, यह काम करता था लेकिन अब यह काम नहीं करता है क्योंकि Num और Eq विभाजित किया गया तो Num aEq a अब तात्पर्य नहीं है। अपने कोड को ठीक करने के लिए बस Eq a स्पष्ट करें:

hola :: (Num a, Eq a) => a -> String 
hola 1 = "OK" 
hola _ = "asdf"