खोज…


ओवरलोड कार्यों पर पुनर्लेखन नियमों का उपयोग करना

इस सवाल में @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


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow