Как я могу восстановить общий доступ в 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?