Haskell Language
पुनर्व्यवस्थित नियम (GHC)
खोज…
ओवरलोड कार्यों पर पुनर्लेखन नियमों का उपयोग करना
इस सवाल में @Viclib ने कुछ ओवरलोडेड फंक्शंस को खत्म करने के लिए टाइपकास्ट कानून का फायदा उठाने के लिए रीराइट नियमों का इस्तेमाल करने के बारे में पूछा:
निम्न वर्ग को ध्यान में रखें:
class ListIsomorphic l where toList :: l a -> [a] fromList :: [a] -> l a
मैं यह भी मांग करता
toList . fromList == id
किtoList . fromList == id
। जीएचसी को उस प्रतिस्थापन के लिए बताने के लिए मैं फिर से कैसे लिखूं?
यह जीएचसी के पुनर्लेखन नियम तंत्र के लिए कुछ हद तक मुश्किल मामला है, क्योंकि ओवरलोड कार्यों को उनके विशिष्ट उदाहरण के तरीकों में फिर से लिखा जाता है, जो कि नियमों के अनुसार GHC द्वारा पर्दे के पीछे बनाए गए हैं (इसलिए fromList :: Seq a -> [a]
जैसा कुछ होगा। Seq$fromList
आदि में फिर से लिखा गया)।
हालांकि, पहली दोबारा लिख कर toList
और fromList
गैर inlined गैर typeclass तरीकों में, हम उन्हें समय से पहले नए सिरे से लिखना से रक्षा कर सकते हैं , और रचना सक्रिय कर सकता है के लिए शासन जब तक उनकी रक्षा:
{-# RULES
"protect toList" toList = toList';
"protect fromList" fromList = fromList';
"fromList/toList" forall x . fromList' (toList' x) = x; #-}
{-# NOINLINE [0] fromList' #-}
fromList' :: (ListIsomorphic l) => [a] -> l a
fromList' = fromList
{-# NOINLINE [0] toList' #-}
toList' :: (ListIsomorphic l) => l a -> [a]
toList' = toList