Suche…


Verwenden von Regeln zum Überschreiben von überladenen Funktionen

In dieser Frage fragte @Viclib nach der Verwendung von Umschreiberegeln, um Typenklassungsgesetze zu nutzen, um einige überladene Funktionsaufrufe zu beseitigen:

Beachten Sie die folgende Klasse:

class ListIsomorphic l where
    toList    :: l a -> [a]
    fromList  :: [a] -> l a

Ich verlange auch diese toList . fromList == id . Wie schreibe ich Regeln zum Umschreiben, um GHC mitzuteilen, dass diese Ersetzung erfolgen soll?

Dies ist ein etwas kniffliger Anwendungsfall für den Mechanismus zum Umschreiben von Regeln von GHC, da überladene Funktionen durch Regeln, die implizit hinter den Kulissen von GHC erstellt werden, in ihre spezifischen Instanzmethoden geschrieben werden (also etwa fromList :: Seq a -> [a] wäre in Seq$fromList usw.).

Durch das Umschreiben von toList und fromList in nicht-eingebettete Nicht- fromList -Klassen-Methoden können wir sie jedoch vor vorzeitigem Überschreiben schützen und beibehalten, bis die Regel für die Komposition ausgelöst wird:

{-# 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow