This is a proof-of-concept implementation of Embedding by Unembedding.
Some examples can be found in https://github.com/kztk-m/EbU-examples.
Higher-order abstract syntax is one of the user-friendly ways to represent the EDSL's syntax.
-- Finally-tagless style (Carette+ 09)
class MyLang e where
-- ...
add :: e Int -> e Int -> e Int
let_ :: e a -> (e a -> e b) -> e b
However, since the expression type operator (e
) is parameterized only by its guest type, it is unclear how we can implement semantics that refers to environments (technically, semantics that are defined for terms-in-context instead of closed terms).
Examples of such semantics include incremental computations, bidirectional transformations, and automatic differentiation.
This library provides operators that address this gap, based on Atkey 09's unembedding---a provably correct isomorphism between de Bruijn-indexed terms and (parametric) higher-order abstract syntax.
data Sem as a = ... -- semantic domain
addSem :: Sem env Int -> Sem env Int -> Sem env Int
letSem :: Sem env a -> Sem (a : env) b -> Sem env b
instance MyLang (EnvI Sem) where
-- ...
add = liftFO2 addSem -- or liftSO (ol0 :. ol0 :. End) addSem
let_ = liftSO (ol0 :. ol1 :. End) letSem