Jak mogę odzyskać udostępnianie w GADT?
WBezpieczne udostępnianie typu obserwowalnego w Haskell Andy Gill pokazuje, jak odzyskać udostępnienie, które istniało na poziomie Haskella, w DSL. Jego rozwiązanie zostało zaimplementowane wpakiet reify danych. Czy można zmodyfikować to podejście do pracy z GADT? Na przykład, biorąc pod uwagę ten GADT:
data Ast e where
IntLit :: Int -> Ast Int
Add :: Ast Int -> Ast Int -> Ast Int
BoolLit :: Bool -> Ast Bool
IfThenElse :: Ast Bool -> Ast e -> Ast e -> Ast e
Chciałbym odzyskać udostępnianie, przekształcając powyższy AST w
type Name = Unique
data Ast2 e where
IntLit2 :: Int -> Ast2 Int
Add2 :: Ast2 Int -> Ast2 Int -> Ast2 Int
BoolLit2 :: Bool -> Ast2 Bool
IfThenElse2 :: Ast2 Bool -> Ast2 e -> Ast2 e -> Ast2 e
Var :: Name -> Ast2 e
przy okazji funkcji
recoverSharing :: Ast -> (Map Name, Ast2 e1, Ast2 e2)
(Nie jestem pewien co do typurecoverSharing
.)
Zauważ, że nie obchodzi mnie wprowadzanie nowych powiązań za pośrednictwem konstruktu let, ale tylko w odzyskiwaniu udostępniania, które istniało na poziomie Haskella. Dlatego mamrecoverSharing
zwróć aMap
.
Jeśli nie można tego zrobić jako pakietu wielokrotnego użytku, czy można to zrobić przynajmniej dla określonego GADT?