के लिए एक फ़ंक्शन को विशेषज्ञता देने वाले नियम को फिर से लिखना जीएचसी RULES
pragma का उपयोग करके, विशिष्ट प्रकारों के लिए एक पॉलिमॉर्फिक फ़ंक्शन का विशेषज्ञ होना संभव है। हास्केल रिपोर्ट से उदाहरण:जीएचसी एक प्रकार के वर्ग
genericLookup :: Ord a => Table a b -> a -> b
intLookup :: Table Int b -> Int -> b
{-# RULES "genericLookup/Int" genericLookup = intLookup #-}
यह GHC एक पूर्णांक अनुक्रमित मेज और जेनेरिक वर्जन अन्यथा, जहां intLookup
शायद और अधिक कुशल हो जाएगा पर intLookup
का उपयोग होगा।
मैं कुछ इसी तरह पूरा करने के लिए, निम्न (थोड़ा सरलीकृत) लोगों की तरह काम करता है का उपयोग कर चाहते हैं:
lookup :: Eq a => [(a, b)] -> a -> b
lookupOrd :: Ord a => [(a, b)] -> a -> b
जहां lookupOrd
इनपुट सूची में से एक Map
बनाता है और फिर Map.lookup
का उपयोग करता है, जो कि a
एक हो की आवश्यकता है Ord
के सदस्य।
अब मैं GHC बताने के लिए जब भी a
वास्तव में Ord
प्रकार वर्ग का एक सदस्य है कि lookupOrd
lookup
के बजाय इस्तेमाल किया जाना चाहिए चाहते हैं। निम्नलिखित नियम, तथापि, typecheck नहीं करता है:
{-# RULES "lookup/Ord" lookup = lookupOrd #-}
GHC (हक) की शिकायत है कि यह संदर्भ (Eq a)
से (Ord a)
अनुमान नहीं कर सकते। क्या कोई पुनर्लेखन नियम है जो मुझे इस तरह के प्रकार के वर्ग-आधारित विशेषज्ञता को करने की अनुमति देगा?
यह पुरानी [खुली दुनिया की समस्या] में बहुत अधिक चल रहा है (http://stackoverflow.com/a/1072523/745903): आप इस पर आधारित निर्णय लेने की कोशिश कर रहे हैं कि किसी प्रकार में कोई प्रकार है या नहीं वर्ग टाइप करें। _But हास्केल की कोई धारणा नहीं है ** ** ** एक प्रकार के वर्ग_ में नहीं है! यह हमेशा माना जाता है कि किसी भी प्रकार के किसी भी वर्ग में हो सकता है (भले ही ऐसा कोई उदाहरण सामने नहीं आया है, फिर भी कोई इसे बाद में जोड़ सकता है)। – leftaroundabout
@ बाएंराउंडबाउट यह समस्या बहुत गंभीर नहीं है; इस तरह के नियम लागू करने के लिए एक सर्वोत्तम प्रयास दृष्टिकोण कल्पना की जा सकती है (यदि जीएचसी इसे पहले स्थान पर समर्थन देगी)। –