Haskell Language
Riscrivi regole (GHC)
Ricerca…
Utilizzo delle regole di riscrittura su funzioni sovraccaricate
In questa domanda , @Viclib ha chiesto informazioni sull'uso delle regole di riscrittura per sfruttare le leggi sulla classe di tipizzazione per eliminare alcune chiamate di funzioni sovraccariche:
Considera la seguente classe:
class ListIsomorphic l where toList :: l a -> [a] fromList :: [a] -> l a
Lo chiedo anche per
toList . fromList == id
. Come scrivo le regole di riscrittura per dire a GHC di fare quella sostituzione?
Questo è un caso piuttosto complicato per il meccanismo delle regole di riscrittura di GHC, perché le funzioni sovraccaricate vengono riscritte nei loro specifici metodi di istanza da regole che sono implicitamente create dietro le quinte da GHC (quindi qualcosa come fromList :: Seq a -> [a]
sarebbe riscritto in Seq$fromList
ecc.).
Tuttavia, prima riscrivendo su toList
e su fromList
in fromList
non in linea non tipografici, possiamo proteggerli da una riscrittura prematura , e conservarli finché la regola per la composizione non può sparare:
{-# 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