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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow