2012-02-04 27 views
15

मैं हास्केल के लिए नया हूं, और सामान्य रूप से, कार्यात्मक प्रोग्रामिंग के लिए, और मैं इसके वाक्यविन्यास के साथ थोड़ा असहज हूं।=> प्रतीक हास्केल में क्या मतलब है?

निम्नलिखित कोड में => बताता है क्या? और (Num a, Ord a) भी?

loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t 

उत्तर

23

यह एक टाइपक्लास बाधा है; (Num a, Ord a) => ... का अर्थ है कि loop किसी भी प्रकार a के साथ काम करता है जो Num और Ord टाइपक्लास का उदाहरण है, क्रमशः संख्यात्मक प्रकार और क्रमबद्ध प्रकारों के अनुरूप है। मूल रूप से, आप loop के => के दाईं ओर दिए गए प्रकार के रूप में सोच सकते हैं, a को Num और Ord का उदाहरण होना आवश्यक है।

आप ओएसओ इंटरफेस के मूल रूप से टाइपक्लास के बारे में सोच सकते हैं (लेकिन वे एक ही बात नहीं हैं!) - वे परिभाषाओं का एक सेट encapsulate जो किसी भी उदाहरण का समर्थन करना चाहिए, और इन परिभाषाओं का उपयोग कर जेनेरिक कोड लिखा जा सकता है। उदाहरण के लिए, Num में संख्यात्मक संचालन जैसे जोड़ और गुणा शामिल है, जबकि Ord में, उससे भी कम, और इसी तरह के शामिल हैं।

टाइपक्लास पर अधिक जानकारी के लिए, से this introduction देखें।

1

के बाएं हाथ की तरफ => आप प्रकार है कि सही पर उपयोग किया जाता है के लिए की कमी की घोषणा।

उदाहरण में आप देते हैं, इसका मतलब है कि aOrd प्रकार वर्ग और Num प्रकार वर्ग दोनों का उदाहरण होने के लिए बाध्य है।

8

=> एक प्रकार हस्ताक्षर के दो हिस्सों को अलग करती है:

  • बाईं तरफ, बाधाओं typeclass
  • दाईं ओर, वास्तविक प्रकार

तो तुम अर्थ के रूप में (Num a, Ord a) => a -> (t -> t) -> t -> t के बारे में सोच सकता है " प्रकार a -> (t -> t) -> t -> t है और a के लिए Num उदाहरण और a के लिए Ord उदाहरण होना चाहिए "।

typeclasses अधिक जानकारी के लिए http://www.learnyouahaskell.com/types-and-typeclasses

4

एक तरह से सोचने के लिए के बारे में यह है कि Ord a और Num a कार्य करने के लिए अतिरिक्त आदानों कर रहे हैं। वे एक विशेष प्रकार के इनपुट हैं हालांकि: शब्दकोश। जब आप किसी विशेष प्रकार a के साथ इस फ़ंक्शन का उपयोग करते हैं, तो पर Ord और Num संचालन के लिए शब्दकोश भी उपलब्ध होना चाहिए।

कोई भी फ़ंक्शन जो शब्दकोश इनपुट के साथ फ़ंक्शन का उपयोग करता है, वही शब्दकोश इनपुट भी होना चाहिए।

foo :: (Num a, Ord a) => a -> t 
foo x = loop x someFunc someT 

हालांकि, आपको इन शब्दकोशों को स्पष्ट रूप से पास करने की आवश्यकता नहीं है।हास्केल आपके लिए यह ख्याल रखेगा, मान लें कि एक शब्दकोश उपलब्ध है। आप टाइपक्लास उदाहरण के साथ एक शब्दकोश बना सकते हैं।

instance Num MyType with 
    x + y = ... 
    x - y = ... 
    ... 

यह MyType पर Num के संचालन के लिए एक शब्दकोश बनाता है, इसलिए MyType कहीं भी इस्तेमाल किया जा सकता है कि Num a एक आवश्यक इनपुट है (यह मानते हुए इसे अन्य आवश्यकताओं को संतुष्ट, निश्चित रूप से)।

+1

यह स्पष्ट करने योग्य है कि हालांकि हम उन्हें "शब्दकोश" कहते हैं, वे _not_ हैश टेबल हैं, बल्कि कार्यों के रिकॉर्ड हैं। वे ऑब्जेक्ट उन्मुख भाषाओं में वी-टेबल की तरह हैं, सिवाय इसके कि वे मूल्यों से जुड़े नहीं हैं। – hammar

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