Haskell Language
Umschreibungsregeln (GHC)
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