2010-07-31 11 views
6

कार्यात्मक निर्भरताओं के उदाहरण मैंने container -> element, और arguments -> result (Mult Matrix Vector Vector में) मैप करने के लिए उबाल दिया है। वे प्रकार के कार्यों के साथ बेहतर व्यक्त किया प्रतीत होता है। डेटाबेस सिद्धांत में, अधिक जटिल संबंधों को माना जाता है कि इस फ़ॉर्म के नहीं हैं (जैसे a -> b, b -> a)।हास्केल: कार्यात्मक निर्भरताओं के nonobvious उदाहरण

क्या हास्केल में एफडी के उपयोग के उदाहरण हैं जिन्हें टाइप फ़ंक्शंस का उपयोग करके अच्छी तरह लिखा नहीं जा सकता है?

उत्तर

3

हेनरिक अपफेलमस ने पहले ही कहा है कि एमपीटीसी + फनडेप्स और टीएफ अकेले बराबर हैं। अंतर तब उत्पन्न होते हैं जब वे ओवरलैपिंग उदाहरणों के साथ विशेष रूप से अन्य एक्सटेंशन के साथ संयुक्त होते हैं। जब फनडेप्स ओवरलैपिंग की अनुमति देता है तो ओवरलैपिंग की अनुमति होने पर टीएफ अवांछित होता है। उदाहरण के लिए यह FunDeps के साथ आसान समानता प्रकार समानता है:

data HTrue 
data HFalse 

class TypeEq a b eq | a b -> eq 
instance    TypeEq a a HTrue 
instance eq ~ HFalse => TypeEq a b eq 

यहां मुख्य बिंदु ओवरलैपिंग है। सिद्धांत रूप में ओवरलैपिंग के बिना प्रकार समानता को कार्यान्वित करना संभव है लेकिन इसे कंपाइलर समर्थन की आवश्यकता होगी। उस दृष्टिकोण को ओलेग द्वारा यहां वर्णित किया गया है: http://okmij.org/ftp/Haskell/typeEQ.html

पीएस इस विषय पर हैकेल-प्राइम मेलिंग सूची पर lengthy discussion था।

4

मैनुअल चक्रवर्ती explains के रूप में, कार्य और कार्यात्मक निर्भरताओं का प्रकार लगभग समान अभिव्यक्ति है, आप एक फॉर्मूलेशन को दूसरे में अनुवाद कर सकते हैं। जब आप अन्य भाषा एक्सटेंशन जैसे GADT या UndecidableInstances के साथ बातचीत को देखते हैं तो वे केवल तभी भिन्न होते हैं। मैं इकट्ठा करता हूं कि परिवारों को वर्तमान में जीएचसी में कार्यान्वयन के लिए अनुकूल किया गया है क्योंकि जीएडीटी और अस्तित्व के प्रकारों के साथ उनकी बातचीत काफी सरल है।

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