2013-03-19 16 views
16

तो, मेरे पास एक बहुत ही सरल कार्य है जो दो पैरामीटर लेता है: पहला एक घंटा (0 और 23 के बीच) होता है और दूसरा एक मिनट (0 और 59 के बीच) होता है। यह फ़ंक्शन घंटे और एक मिनट लौटाता है, और एक सुंदर शैली में घंटे को प्रारूपित करता है। उदाहरण के लिए, hour 11 12 वापसी 11 heures et 13 minutes। घंटे के फ्रेंच प्रारूप के लिए खेद है।"==" का उपयोग किये बिना "ईक" प्रकार की बाधा क्यों जोड़ें?

तो, मैं इस फ़ंक्शन में show फ़ंक्शन का उपयोग करता हूं, और पैरामीटर को एक संख्या होने की आवश्यकता है, इसलिए मेरे पास (Num a, Show a) => a -> a -> String प्रकार की घोषणा है। लेकिन, जब मैं समारोह की कोशिश, मैं एक त्रुटि हो गया और GHC Eq प्रकार बाधा जोड़ने के लिए मुझसे कहते हैं, लेकिन मुझे समझ नहीं आता क्यों मैं इस मामले में Eq प्रकार बाधा की जरूरत है। वहाँ कोड (फिर से, फ्रेंच समारोह में इस्तेमाल किया पाठ के लिए खेद है, लेकिन मुझे लगता है कि यह बहुत महत्वपूर्ण नहीं है अगर आप समारोह नाम और पाठ समझ में नहीं आता) है:

heure :: (Num a, Eq a, Show a) => a -> a -> String 
heure 23 59 = "Minuit" 
heure 12 m = "Midi et " ++ show (m+1) ++ " minutes" 
heure h 59 = show (h+1) ++ " heures" 
heure h m = show h ++ " heures et " ++ show (m+1) ++ " minutes" 

तो: अगर मैं Eq का उपयोग न करें, मुझे एक त्रुटि है और जब मैं इसका उपयोग करता हूं तो मेरा कोड सही है। क्यूं कर?

अपने स्पष्टीकरण के लिए धन्यवाद!

+8

मूल्य v के विरुद्ध एक संख्यात्मक, वर्ण, या स्ट्रिंग अक्षरशः पैटर्न मिलान करना v == k, जहां == पैटर्न के प्रकार के आधार पर ओवरलोड किया गया है। देखें [पैटर्न मिलान हास्केल 2010 भाषा रिपोर्ट 3.17.2 अनौपचारिक शब्दार्थ] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17) – nymk

+2

@nymk: [2010 रिपोर्ट धारा 6.4] (http://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1350006.4) कहता है "[टी] वह संख्यात्मक प्रकारों की कक्षा 'संख्या'' eq' का उप-वर्ग है, क्योंकि सभी संख्याओं की तुलना की जा सकती है समानता के लिए। " लेकिन यहां क्या हो रहा है कि [जीएचसी के हाल के संस्करण इसे नहीं करते हैं] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/release-7-4-1.html): "' न्यू 'वर्ग में अब' ईक' या 'शो' सुपरक्लास नहीं हैं। इसलिए कई अन्य वर्गों और कार्यों को 'न्यू' बाधा पर निर्भर होने के बजाय स्पष्ट 'ईक' या 'शो' बाधाएं मिली हैं उनको उप्लब्ध कराओ।" –

उत्तर

22

आप क्योंकि आप जाँच कर रहे हैं कि क्या h23 या 12 के बराबर है और क्या m59 के बराबर है Eq बाधा की जरूरत है। आप इसे पैटर्न मिलान का उपयोग कर कर रहे हैं, == नहीं, लेकिन संख्यात्मक अक्षरों के खिलाफ पैटर्न मिलान करने के लिए अभी भी Eq (रचनाकारों के खिलाफ पैटर्न मिलान के विपरीत) की आवश्यकता है।

+1

ओ.के. मैं समझता हूं, आपकी व्याख्या के लिए धन्यवाद! – vildric

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