import Data.Void (Void,absurd)
dire che ho un linguaggio piccolo termine:I codici di REBR. GHC devono essere di tipo preservativo?
data Term c v where
Var :: v -> Term c v
Con :: c -> [Term c v] -> Term c v
Se voglio combinare i termini del tipo Term c Void
e Term c Int
, che dovrebbe essere possibile, dal momento che ho la garanzia che il primo termine non contiene qualsiasi variabile Pertanto, posso scrivere la funzione:
castVar :: Term c Void -> Term c v
castVar (Var i ) = absurd i
castVar (Con x xs) = Con x (map castVar xs)
Tuttavia, sarebbe un peccato per eseguire effettivamente questa funzione, perché so per certo che in realtà non cambia nulla. È sicuro aggiungere i seguenti pragmi:
{-# NOINLINE castVar #-}
{-# RULES "castVar/id" forall x. castVar x = x; #-}
E questo effettivamente raggiungere il risultato desiderato?
Ci sono modi migliori per farlo?