5

में कार्यात्मक निर्भरता मैं वास्तव में इसे प्राप्त नहीं कर सकता। हमें इसकी आवश्यकता क्यों है? मेरा मतलब है कि अगर मैं एक ही प्रकार के पैरामीटर का उपयोग करता हूं, तो मुझे लगता है कि इसका मतलब है कि वे एक ही प्रकार का होना चाहिए।हास्केल

मैंने सुना है कि यह अनंत लूप से बचने के लिए कंपाइलर की मदद कर सकता है। क्या कोई मुझे इसके बारे में कुछ और जानकारी बता सकता है?

अंत में, क्या कोई भी 'पैटर्न और प्रथाओं' हमें वास्तविक विश्व हास्केल में कार्यात्मक निर्भरता के उपयोग पर पालन करना चाहिए?

[अनुवर्ती प्रश्न]

class Extract container element where 
    extract :: container -> element 

instance Extract (a,b) a where 
    extract (x,_) = x 

उपरोक्त कोड में, मैं एक ही प्रकार चर इस्तेमाल किया 'एक' दोनों कंटेनर और तत्व के लिए, मुझे लगता है कि संकलक इस प्रकार अनुमान लगा सकते हैं कि इन दो प्रकार एक ही प्रकार के हैं।

लेकिन जब मैं GHCi में इस कोड की कोशिश की, मैं निम्नलिखित प्रतिक्रिया मिल गया:

*Main> extract('x',3) 
<interactive>:1:0: 
    No instance for (Extract (Char, t) element) 
     arising from a use of `extract' at <interactive>:1:0-13 
    Possible fix: 
     add an instance declaration for (Extract (Char, t) element) 
    In the expression: extract ('x', 3) 
    In the definition of `it': it = extract ('x', 3) 

जब उनमें से एक प्रकार 'चार', क्यों एक दूसरे को अभी भी अनसुलझे प्रकार 'तत्व है होने के लिए निर्दिष्ट किया गया है '?

+5

http://www.haskell.org/haskellwiki/Functional_dependencies मदद करता है? – lijie

उत्तर

6

मैंने सोचा कि यह explains यह काफी अच्छी तरह से है। तो मूल रूप से यदि आपके पास ए -> बी का एफडी संबंध है तो इसका मतलब है कि टाइप-क्लास इंस्टेंस के लिए केवल 'बी' हो सकता है, इसलिए इंट इंट के साथ ही आप इंट फ्लोट भी नहीं कर सकते । यही उनका मतलब है जब ऐसा कहा जाता है कि 'बी' विशिष्ट रूप से 'ए' से निर्धारित होता है। यह किसी भी प्रकार के पैरामीटर तक फैलता है। इसकी आवश्यकता क्यों है 1. अनुमान टाइप करें 2. कभी-कभी आप इस तरह की बाधा चाहते हैं।

एफडी के लिए एक विकल्प प्रकार परिवार विस्तार है लेकिन एफडी के सभी मामलों के लिए नहीं है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। वह लेख बहुत अच्छा है। अब मुझे पता है कि मेरा असली सवाल क्या है। आपने कहा 'कभी-कभी आप उस तरह की बाधा चाहते हैं'। मैं इस भाग को समझता हूँ। लेकिन मुझे समझ में नहीं आता कि टाइप अनुमान के लिए इसकी आवश्यकता क्यों है। मैंने अपने प्रश्न को एक और अनुवर्ती प्रश्न के साथ अद्यतन किया है। उदाहरण ऊपर दिए गए विकी पेज से है। – aXqd

+0

मैंने आखिरकार इसे समझ लिया। कंपाइलर अभी भी टाइपक्लास का सही उदाहरण ढूंढने की कोशिश कर रहा है, इसलिए इसका अभी तक उस विशिष्ट उदाहरण से कोई लेना देना नहीं है। मैं वापसी का प्रकार नहीं देता, इसलिए यह संदिग्ध है। – aXqd

+0

यदि मैं कार्यात्मक निर्भरता जोड़ता हूं, तो संकलक यह सुनिश्चित कर सकता है कि जब तक कंटेनर का प्रकार कोई मिलान मिल सके, तब तक संकलक उस उदाहरण का उपयोग कर सकता है, क्योंकि इसमें केवल एक प्रकार का रिटर्न प्रकार हो सकता है। – aXqd