Skip to content

Commit f6f487c

Browse files
committed
Added a few more explanation
1 parent e324b6b commit f6f487c

File tree

1 file changed

+74
-52
lines changed

1 file changed

+74
-52
lines changed

ebu/src/Unembedding.hs

Lines changed: 74 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8288
import 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.
8894
class Weakenable (sem :: [k] -> k' -> Type) where
@@ -147,7 +153,7 @@ class Variables (Var sem) => LiftVariables (sem :: [k] -> k -> Type) where
147153

148154
instance 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
152158
newtype 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'.
290297
class LiftOfLength f as t | t -> as where
291298
liftOfLength :: OfLength as -> f t
292299

@@ -360,6 +367,9 @@ ofl2TEnv :: OfLength as -> TEnv as
360367
ofl2TEnv LZ = ENil
361368
ofl2TEnv (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-
394400
liftSOn :: forall sem ss r. LiftVariables sem => Dim ss
395401
-> (forall env. FuncTerm sem env ss r) -> FuncU sem ss r
396402
liftSOn ns f =
@@ -492,28 +498,13 @@ fromFuncSem' :: FuncSem' semR env ss r -> Env (SemRep' env) ss -> semR env r
492498
fromFuncSem' f ENil = f
493499
fromFuncSem' 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

541550
data 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.
596605
data 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)
598611
data 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
603621
data 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.
606624
data 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
611628
data HRepK (kbspec :: KBindSpec k) where
612629
HRK :: EnvI sem a -> HRepK (MkKBindSpec sem a)
613630

631+
-- | HOAS representation.
614632
data 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 =
626644
weakenAll :: TEnv env' -> Env (SemRepK env') bs -> Env HRepK bs
627645
weakenAll 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.
630649
liftSOGen :: 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
633652
liftSOGen f ks = EnvI $ \shEnv -> f (mapEnv (convertHtoSemGen shEnv) ks)
634653

654+
-- | Binding description.
635655
data 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

640662
descToTEnv :: BDesc as bs -> TEnv as
@@ -705,18 +727,8 @@ fromFuncSemGen _ f ENil = f
705727
fromFuncSemGen (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

Comments
 (0)