2012-04-21 18 views
11

हास्केल में हमें लॉजिकल के साथ प्रकारों पर बाधाओं को संयोजित करने की क्षमता दी जाती है।मैं लॉजिकल या हास्केल में दो प्रकार की बाधाओं को कैसे जोड़ सकता हूं?

पर विचार करें

type And (a :: Constraint) b = (a, b) 

निम्नलिखित या अधिक complicatedly

class (a, b) => And a b 
instance (a, b) => And a b 

मैं कैसे तार्किक या एक साथ करने के लिए दो की कमी हास्केल में जानना चाहते हैं।

मेरा सबसे करीबी प्रयास यह है, लेकिन यह काफी काम नहीं करता है। इस प्रयास में मैं टैग के साथ प्रकार की बाधाओं को प्रमाणित करता हूं और उन्हें अंतर्निहित मानकों के साथ खराब कर देता हूं।

data ROr a b where 
L :: a => ROr a b 
R :: b => ROr a b 

type Or a b = (?choose :: ROr a b) 

y :: Or (a ~ Integer) (Bool ~ Integer) => a 
y = case ?choose of 
L -> 4 

x :: Integer 
x = let ?choose = L in y 

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

मैं तर्कसंगत या दो बाधाओं को एक साथ कैसे कर सकता हूं?

+0

या तो क्या? यह संतुष्ट होने पर यह आपको असंबद्ध कर देगा। –

उत्तर

12

मेरा मानना ​​है कि स्वचालित रूप से ROr a b चुनने का कोई तरीका नहीं है; अगर खुली दुनिया की धारणा का उल्लंघन होगा, उदाहरण के लिए b संतुष्ट था, लेकिन बाद में a भी संतुष्ट था; किसी भी संघर्ष समाधान नियम के लिए मौजूदा कोड के व्यवहार को बदलने के लिए एक उदाहरण के अतिरिक्त होने का कारण होगा।

है, R उठा जब b संतुष्ट है लेकिन a खुली दुनिया धारणा टूट जाता है नहीं है, क्योंकि यह निर्णय लेने से एक उदाहरण नहीं संतुष्ट है कि शामिल है; यदि आपने "दोनों संतुष्ट" कन्स्ट्रक्टर को जोड़ा है, तो भी आप यह तय करने में सक्षम होंगे कि कोई उदाहरण मौजूद नहीं है (यह देखकर कि आपको L या R मिल रहा है)।

इसलिए, मुझे विश्वास नहीं है कि इस तरह के या बाधा संभव है; यदि आप देख सकते हैं कि आपको कौन सा उदाहरण मिलता है, तो आप एक प्रोग्राम बना सकते हैं जिसका व्यवहार एक उदाहरण जोड़कर बदलता है, और यदि आप यह नहीं देख सकते कि आपको कौन सा उदाहरण मिलता है, तो यह बहुत बेकार है।

इस और सामान्य उदाहरण संकल्प के बीच का अंतर, जो असफल भी हो सकता है, आमतौर पर, संकलक यह तय नहीं कर सकता कि एक बाधा संतुष्ट है; यहां, आप संकलक से यह तय करने के लिए कह रहे हैं कि बाधा संतुष्ट नहीं हो सकती है। एक सूक्ष्म लेकिन महत्वपूर्ण अंतर।

+0

क्या एक तर्कसंगत होना संभव है या जो सरल संतोषजनक बाधाओं के बजाय संभावित संतोषजनक बाधाओं के साथ काम करता है? –