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?

questionAnswers(2)

yourAnswerToTheQuestion