@@ -39,7 +39,7 @@ module Unembedding
3939 liftFOF ,
4040
4141 -- * Lifting functions for second-order language constructs
42- OfLength (.. ), ol0 , ol1 , ol2 , ol3 , ol4 ,
42+ OfLength (.. ), LiftOfLength ( .. ), ol0 , ol1 , ol2 , ol3 , ol4 ,
4343 FuncTerm , FuncU , Dim , DimSimple (.. ),
4444 liftSOn ,
4545
@@ -51,8 +51,11 @@ module Unembedding
5151 liftSO ,
5252
5353 -- * Lifting functions for languages with multiple semantic domains (experimental)
54- liftFO' , liftFO0' , liftFO1' , liftFO2' ,
54+ liftFO0' , liftFO1' , liftFO2' ,
5555 liftFOF' ,
56+
57+ liftFO' , SemRepFO (.. ), HRepFO (.. ), SemSigFO (.. ),
58+
5659 FuncSem' , FuncH' , Dim' , DimMult (.. ), liftSOn' ,
5760
5861 -- ** Interpretation functions
@@ -63,12 +66,15 @@ module Unembedding
6366 SemSig (.. ), SemRep' (.. ), HRep' (.. ), liftSO' ,
6467 liftSOF' ,
6568
66- -- ** More generalized interface (experimental)
69+ -- * More generalized interface for nested EbU
6770 FuncSemGen , FuncHGen , DimNested (.. ), BDesc (.. ), DimGen ,
6871 liftSOnGen , liftSOGen ,
72+ BsFunc , BsFuncSem ,
6973
74+ -- ** Internal datatypes and functions used in 'liftSOnGen'
7075
71-
76+ KBindSpec (.. ), BindSpec (.. ), ArgSpec (.. ),
77+ HRepK (.. ), HRepGen (.. ), SemRepK (.. ), SemRepGen (.. ),
7278
7379 -- * Internal Manipulation of Variables
7480 var0 , var1 , var2 ,
@@ -81,8 +87,8 @@ import Unsafe.Coerce (unsafeCoerce)
8187
8288import Unembedding.Env
8389
84- -- useful envs
85- type TEnv = Env Proxy -- Type environment.
90+ -- | Value-level representation of guest's typing environments.
91+ type TEnv = Env Proxy
8692
8793-- | Weakenable semantics.
8894class Weakenable (sem :: [k ] -> k' -> Type ) where
@@ -147,7 +153,7 @@ class Variables (Var sem) => LiftVariables (sem :: [k] -> k -> Type) where
147153
148154instance LiftVariables Ix where
149155
150- -- Wrapper the quantifies over env so that our type can only have one param like the HOAS
156+ -- | Wrapper the quantifies over env so that our type can only have one param like the HOAS
151157-- Called EnvI, short for EnvIndexed, as it is indexed by an environment
152158newtype EnvI sem a = EnvI { runEnvI :: forall as . TEnv as -> sem as a }
153159
@@ -287,6 +293,7 @@ data OfLength as where
287293 LZ :: OfLength '[]
288294 LS :: OfLength as -> OfLength (a ': as )
289295
296+ -- | Class to reuse 'ol1', ..., 'ol4' for 'liftSOn', 'liftSOn'', and 'liftSOnGen'.
290297class LiftOfLength f as t | t -> as where
291298 liftOfLength :: OfLength as -> f t
292299
@@ -360,6 +367,9 @@ ofl2TEnv :: OfLength as -> TEnv as
360367ofl2TEnv LZ = ENil
361368ofl2TEnv (LS n) = ECons Proxy (ofl2TEnv n)
362369
370+ type Dim = Env DimSimple
371+
372+
363373-- | Handy version of 'liftSO'. The type looks complicated but can be comprehensive
364374-- when we apply it to specific @Dim ss@ values.
365375--
@@ -387,10 +397,6 @@ ofl2TEnv (LS n) = ECons Proxy (ofl2TEnv n)
387397-- -> EnvI sem a1
388398-- -> (EnvI sem a2 -> EnvI sem b -> EnvI sem a3)
389399-- -> EnvI sem r
390-
391-
392- type Dim = Env DimSimple
393-
394400liftSOn :: forall sem ss r . LiftVariables sem => Dim ss
395401 -> (forall env . FuncTerm sem env ss r ) -> FuncU sem ss r
396402liftSOn ns f =
@@ -492,28 +498,13 @@ fromFuncSem' :: FuncSem' semR env ss r -> Env (SemRep' env) ss -> semR env r
492498fromFuncSem' f ENil = f
493499fromFuncSem' f (ECons (SemR' x) xs) = fromFuncSem' (f x) xs
494500
495-
496- liftSOn' ::
497- forall semExp semR ss r proxy .
498- LiftVariables semExp =>
499- Dim' ss
500- -> proxy semExp
501- -> (forall env . FuncSem' semR env ss r )
502- -> FuncH' semExp semR ss r
503- liftSOn' ns _ f =
504- let h :: forall env . Env (SemRep' env ) ss -> semR env r
505- h = fromFuncSem' f
506- in toFuncH' ns (liftSO' @ semExp h)
507-
508-
509-
501+ -- | Handy version of 'liftSO'. Unlike 'liftSOn', it requires @proxy semExp@ to determine which
502+ -- semantic domain variables are in.
503+ --
510504-- >>> :t liftSOn' ENil (Proxy @Ix)
511505-- liftSOn' ENil (Proxy @Ix)
512506-- :: forall {k} {kR} {semR :: [k] -> kR -> *} {r :: kR}.
513507-- (forall (env :: [k]). semR env r) -> EnvI semR r
514-
515-
516-
517508-- >>> :t liftSOn' (ol0 :. ol0 :. ENil)
518509-- >>> :t liftSOn' (ol1 :. ENil)
519510-- liftSOn' (ol0 :. ol0 :. ENil)
@@ -536,6 +527,24 @@ liftSOn' ns _ f =
536527-- -> (forall (env :: [k2]). sem (a1 : env) a2 -> semR env r)
537528-- -> (EnvI semExp a1 -> EnvI sem a2)
538529-- -> EnvI semR r
530+ liftSOn' ::
531+ forall semExp semR ss r proxy .
532+ LiftVariables semExp =>
533+ Dim' ss
534+ -> proxy semExp
535+ -> (forall env . FuncSem' semR env ss r )
536+ -> FuncH' semExp semR ss r
537+ liftSOn' ns _ f =
538+ let h :: forall env . Env (SemRep' env ) ss -> semR env r
539+ h = fromFuncSem' f
540+ in toFuncH' ns (liftSO' @ semExp h)
541+
542+
543+
544+
545+
546+
547+
539548
540549
541550data SemSigFO k = forall k' . MkSemSigFO ([k ] -> k' -> Type ) k'
@@ -592,25 +601,34 @@ Further generalized interface.
592601-}
593602
594603
595- -- MkKBindSpec sem a has kind KBindSpec k
604+ -- | A pair of semantic domain and a type.
596605data KBindSpec k = forall k' . MkKBindSpec ([k ] -> k' -> Type ) k'
597606
607+ -- | Binder spec. @MkBindSpec [a1,...,an] [MkKBindSpec sem1 b1, ..., MkKBindSpec semm bm]@
608+ -- express that a binder binds @[a1,...,an,b1,...,bm]@, in which
609+ -- * @a1,...,an@ are to be unembedded
610+ -- * @b1,...,bm@ are kept for the future processing (hence they are compled with semantic domains)
598611data BindSpec k = MkBindSpec [k ] [KBindSpec k ]
599612
600- data ArgSpec k = forall k' . MkArgSpec ([k ] -> k' -> Type ) (BindSpec k ) k'
601-
613+ -- | A spec for a language construct argument.
614+ data ArgSpec k =
615+ forall k' . MkArgSpec
616+ ([k ] -> k' -> Type ) -- ^ The semantic domain for the argument to be interpreted.
617+ (BindSpec k ) -- ^ The binder spec of the argument
618+ k' -- ^ The (guest) type of the argument
602619
620+ -- | "semantic domain" represention for "k"ept bindings
603621data SemRepK (env :: [k ]) (kbspec :: KBindSpec k ) where
604622 SemRK :: Weakenable sem => sem env a -> SemRepK env (MkKBindSpec sem a )
605- -- "semantic domain" representation.
623+ -- | "semantic domain" representation.
606624data SemRepGen (env :: [k ]) (aspec :: ArgSpec k ) where
607625 SemRGen :: (Env (SemRepK (Append as env )) bs -> sem (Append as env ) b ) -> SemRepGen env (MkArgSpec sem (MkBindSpec as bs ) b )
608626
609- -- HOAS representation.
610-
627+ -- | HOAS represention for "k"ept bindings
611628data HRepK (kbspec :: KBindSpec k ) where
612629 HRK :: EnvI sem a -> HRepK (MkKBindSpec sem a )
613630
631+ -- | HOAS representation.
614632data HRepGen (semExp :: [k ] -> k -> Type ) (aspec :: ArgSpec k ) where
615633 HRGen :: TEnv as -> (Env (EnvI semExp ) as -> Env HRepK bs -> EnvI sem b ) -> HRepGen semExp (MkArgSpec sem (MkBindSpec as bs ) b )
616634
@@ -626,15 +644,19 @@ convertConstructArgGen shEnv shAs k kargs =
626644weakenAll :: TEnv env' -> Env (SemRepK env' ) bs -> Env HRepK bs
627645weakenAll shAsEnv = mapEnv (\ (SemRK s) -> HRK $ EnvI $ \ tenv' -> weakenMany shAsEnv tenv' s)
628646
629- -- | Core function to lift second-order constructs, supporting multiple semantic domains.
647+ -- | Core function to lift second-order constructs, supporting multiple semantic
648+ -- domains and selective unembedding.
630649liftSOGen :: forall semExp sem ss r . LiftVariables semExp =>
631650 (forall env . Env (SemRepGen env ) ss -> sem env r )
632651 -> Env (HRepGen semExp ) ss -> EnvI sem r
633652liftSOGen f ks = EnvI $ \ shEnv -> f (mapEnv (convertHtoSemGen shEnv) ks)
634653
654+ -- | Binding description.
635655data BDesc (as :: [k ]) (bs :: [KBindSpec k ]) where
636656 E :: BDesc '[] '[]
657+ -- | stands for the corresponding binding is to be kept (for further processing afterwards).
637658 K :: Weakenable sem => BDesc as bs -> BDesc as (MkKBindSpec sem b : bs )
659+ -- | stands for the corresponding binding is to be unembedded.
638660 U :: BDesc as bs -> BDesc (a : as ) bs
639661
640662descToTEnv :: BDesc as bs -> TEnv as
@@ -705,18 +727,8 @@ fromFuncSemGen _ f ENil = f
705727fromFuncSemGen (DimNested d :. ds) f (ECons (SemRGen x) xs) =
706728 fromFuncSemGen ds (f $ fromFuncSemK d x) xs
707729
708- liftSOnGen ::
709- forall semExp semR ss r proxy .
710- LiftVariables semExp =>
711- DimGen ss
712- -> proxy semExp
713- -> (forall env . FuncSemGen semR env ss r )
714- -> FuncHGen semExp semR ss r
715- liftSOnGen ds _ f =
716- let h :: forall env . Env (SemRepGen env ) ss -> semR env r
717- h = fromFuncSemGen ds f
718- in toFuncHGen ds (liftSOGen @ semExp h)
719-
730+ -- | Further generation of 'liftSOn''.
731+ --
720732-- >>> :t liftSOnGen (DimNested (K E) :. ENil) Proxy
721733-- liftSOnGen (DimNested (K E) :. ENil) Proxy
722734-- :: forall {k} {k'1} {kR} {k'2} {semExp :: [k] -> k -> *}
@@ -725,7 +737,6 @@ liftSOnGen ds _ f =
725737-- (LiftVariables semExp, Weakenable sem1) =>
726738-- (forall (env :: [k]). (sem1 env b -> sem2 env a) -> semR env r)
727739-- -> (EnvI sem1 b -> EnvI sem2 a) -> EnvI semR r
728-
729740-- >>> :t liftSOnGen (ol1 :. ENil) Proxy
730741-- liftSOnGen (ol1 :. ENil) Proxy
731742-- :: forall {k2} {kR} {k'} {semExp :: [k2] -> k2 -> *}
@@ -734,8 +745,6 @@ liftSOnGen ds _ f =
734745-- LiftVariables semExp =>
735746-- (forall (env :: [k2]). sem (a1 : env) a2 -> semR env r)
736747-- -> (EnvI semExp a1 -> EnvI sem a2) -> EnvI semR r
737-
738-
739748-- >>> :t liftSOnGen (DimNested (K (U E)) :. ENil) Proxy
740749-- liftSOnGen (DimNested (K (U E)) :. ENil) Proxy
741750-- :: forall {k} {k'1} {kR} {k'2} {semExp :: [k] -> k -> *}
@@ -746,7 +755,6 @@ liftSOnGen ds _ f =
746755-- (forall (env :: [k]).
747756-- (sem1 (a1 : env) b -> sem2 (a1 : env) a2) -> semR env r)
748757-- -> (EnvI semExp a1 -> EnvI sem1 b -> EnvI sem2 a2) -> EnvI semR r
749-
750758-- >>> :t liftSOnGen (ol0 :. DimNested (K E) :. ENil) Proxy
751759-- liftSOnGen (ol0 :. DimNested (K E) :. ENil) Proxy
752760-- :: forall {k2} {k'1} {kR} {k'2} {k'3} {semExp :: [k2] -> k2 -> *}
@@ -757,3 +765,17 @@ liftSOnGen ds _ f =
757765-- (forall (env :: [k2]).
758766-- sem2 env a1 -> (sem1 env b -> sem3 env a2) -> semR env r)
759767-- -> EnvI sem2 a1 -> (EnvI sem1 b -> EnvI sem3 a2) -> EnvI semR r
768+
769+
770+ liftSOnGen ::
771+ forall semExp semR ss r proxy .
772+ LiftVariables semExp =>
773+ DimGen ss
774+ -> proxy semExp
775+ -> (forall env . FuncSemGen semR env ss r )
776+ -> FuncHGen semExp semR ss r
777+ liftSOnGen ds _ f =
778+ let h :: forall env . Env (SemRepGen env ) ss -> semR env r
779+ h = fromFuncSemGen ds f
780+ in toFuncHGen ds (liftSOGen @ semExp h)
781+
0 commit comments