Как я могу восстановить общий доступ в GADT?

ВТип-безопасный наблюдаемый обмен в Haskell Энди Гилл показывает, как восстановить общий доступ, существовавший на уровне Haskell, в DSL. Его решение реализовано впакет данных, Можно ли изменить этот подход для работы с GADT? Например, учитывая этот 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

Я хотел бы восстановить совместное использование путем преобразования вышеуказанного AST в

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

по функции

recoverSharing :: Ast -> (Map Name, Ast2 e1, Ast2 e2)

(Я не уверен насчет типаrecoverSharing.)

Обратите внимание, что я не забочусь о введении новых привязок с помощью конструкции let, но только о восстановлении общего доступа, существовавшего на уровне Haskell. Вот почему у меня естьrecoverSharing вернутьMap.

Если это не может быть сделано как пакет многократного использования, может ли это быть сделано по меньшей мере для конкретного GADT?

Ответы на вопрос(2)

Ваш ответ на вопрос