zh      !"#$%&'()*+,-./0123456789:;<=>?@ABCD E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g GHC experimental emw4@rice.edu hijklmnopqrstGHC experimental emw4@rice.eduGHC experimental emw4@rice.eduAn Append ctx1 ctx2 ctx is a "proof" that  ctx = ctx1  ctx2.   Appends two  proofs. Returns the length of an  proof.    GHC experimental emw4@rice.edu A  Member ctx a is a "proof" that the type a is in the type  list ctx, meaning that ctx equals  % t0 ':>' a ':>' t1 ':>' ... ':>' tn for some types  t0,t1,...,tn.     GHC experimental emw4@rice.edu A MapC f c. is a vector with exactly one element of type f a for  each type a in the type list c. Create an empty  vector. Create a singleton  vector. Look up an element of a  vector using a   proof. $Map a function to all elements of a  vector.  Append two  vectors. Make an  proof from any  vector for the second  argument of the append.  A version of  that takes in a uv argument. Split a  vector into two pieces.  Create a uv object for the type list of a  vector. ,Create a vector of proofs that each type in c is a   of c.   GHC experimental emw4@rice.eduuvwx GHC experimental emw4@rice.edu !"#$An Mb ctx b9 is a multi-binding that binds exactly one name for each  type in ctx, where ctx has the form   t1  ...  tn. %&A Name a. is a bound name that is associated with type a. '()*+,-. !"#$%&'()*+,-.&'$%"#() !*+,-. !!"##$%%&''()*+,-.GHC experimental emw4@rice.edu/ The class  Liftable2 f( gives a lifting function for each type f a b  when a and b are Liftable. 01 The class  Liftable1 f( gives a lifting function for each type f a  when a itself is Liftable. 23 The class  Liftable a gives a "lifting function" for a, which can  take any data of type a out of a multi-binding of type $ ctx a. 45A Binding/ is simply a multi-binding that binds one name 6nu f, creates a binding which binds a fresh name n and whose  body is the result of f n. 7ACombines a binding inside another binding into a single binding. 8ESeparates a binding into two nested bindings. The first argument, of  type  c1 c2 c, is a "phantom" argument to indicate how  the context c should be split. 9=Returns a proxy object that enumerates all the types in ctx. :-Creates an empty binding that binds 0 names. ;The expression  nuMulti p f) creates a multi-binding of zero or more , names, one for each element of the vector p. The bound names are  passed the names to f , which returns the body of the  multi-binding. The argument p , of type $ f ctx , acts as a  "phantom"+ argument, used to reify the list of types ctx at the < term level; thus it is unimportant what the type function f is. <;Eliminates an empty binding, returning its body. Note that   elimEmptyMb is the inverse of emptyMb. = cmpName n m compares names n and m of types Name a and Name b, % respectively. When they are equal, Some e is returned for e a proof  of type a :=: b( that their types are equal. Otherwise, None is returned.  For example: J nu $ \n -> nu $ \m -> cmpName n n == nu $ \n -> nu $ \m -> Some Refl E nu $ \n -> nu $ \m -> cmpName n m == nu $ \n -> nu $ \m -> None >8Checks if a name is bound in a multi-binding, returning Left mem  when the name is bound, where mem! is a proof that the type of the @ name is in the type list for the multi-binding, and returning  Right n# when the name is not bound, where n is the name.  For example: I nu $ \n -> mbNameBoundP (nu $ \m -> m) == nu $ \n -> Left Member_Base @ nu $ \n -> mbNameBoundP (nu $ \m -> n) == nu $ \n -> Right n ?BCompares two names inside bindings, taking alpha-equivalence into ! account; i.e., if both are the i#th name, or both are the same name E not bound in their respective multi-bindings, then they compare as / equal. The return values are the same as for = , so that   Some Refl* is returned when the names are equal and Nothing is  returned when they are not. @:Lift a list (but not its elements) out of a multi-binding $&/0123456789:;<=>?@&5$6:;<789=?>3412/0@/0012234456789:;<=>?@GHC experimental emw4@rice.eduA The type  SuperComb a' represents a super-combinator of type a,  i.e., an expression of type a# with no free (Haskell) variables. D Since this cannot be checked directly in the Haskell type system,  the  SuperComb3 data type is hidden, and the user can only create 8 super-combinators using Template Haskell, through the B  operator. yz{HAn quoted expression is a CAF if all of its names are bound globally or  within the quotation B superComb< is used with Template Haskell to create super-combinators;  see documentation for C to see how it is used. C mbToplevel f b applies super-combinator f to the body of  multi-binding b. For example: ; mbToplevel $(superComb [| f |]) (nu $ \n -> n) = nu f ABCABCABC GHC experimental emw4@rice.edu|}~DD EFGInstances of the NuElim a class allow the type a to be used with  J and K!. The structure of this class is # mostly hidden from the user; see L to see how to create  instances of the NuElim class. HIJThe expression nuWithElimMulti args f takes a sequence args of , zero or more multi-bindings, each of type  Mb ctx ai for the same  type context ctx of bound names, and a function f and does the  following: * Creates a multi-binding that binds names  n1,...,nn, one name for  each type in ctx;  Substitutes the names  n1,...,nn for the names bound by each  argument in the args& sequence, yielding the bodies of the args  (using the new name n ); and then  Passes the sequence  n1,...,nn along with the result of  substituting into args to the function f, which then returns - the value for the newly created binding. Note that the types in args must each have a NuElim instance;  this is represented with the  NuElimList type class. Here are some examples: O commuteFun :: (NuElim a, NuElim b) => Mb ctx (a -> b) -> Mb ctx a -> Mb ctx b  commuteFun f a = 7 nuWithElimMulti ('mbToProxy' f) ('Nil' :> f :> a) M (\_ ('Nil' :> 'Identity' f' :> 'Identity' a') -> f' a') K Similar to J( but takes only one argument that binds  a single name. LETemplate Haskell function for creating NuElim instances for (G)ADTs. H Typical usage is to include the following line in the source file for  (G)ADT T, (here assumed to have two type arguments):  + $(mkNuElimData [t| forall a b . T a b |]) The L3 call here will create an instance declaration for  G (T a b)2. It is also possible to include a context in the - forall type; for example, if we define the ID data type as follows:   data ID a = ID a then we can create a G instance for it like this:  * $( mkNuElimData [t| NuElim a => ID a |]) CNote that, when a context is included, the Haskell parser will add  the forall a for you. EFGHIJKLJKGHLEFIEFFGHHIJKLGHC experimental emw4@rice.edu3uvwx $&/0123456789:;<=>?@ABCDEFGHIJKL GHC experimental emw4@rice.eduMNOPQRSTUVWXYZ[\]MNOPQRSTUVWXYZ[\]\[WZYX]SVUTPRQMONMONNOPRQQRSVUTTUVWZYXXYZ[\] GHC experimental emw4@rice.edu^_`abcde^_`abcde^_`abcde^_`abcde GHC experimental emw4@rice.edu$fgMNOPQRSTUVWXYZ[\]fgfgfg !"#$%&'()*"+,--../0123456789:;<=>?@ABCDEFGHIJKLMN O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q rstuvwxyz{|}~L                                 hobbits-1.0"Data.Binding.Hobbits.PatternParserData.Type.List.ListData.Type.List.Proof.AppendData.Type.List.Proof.MemberData.Type.List.MapData.Binding.Hobbits.InternalData.Binding.Hobbits.MbData.Binding.Hobbits.SuperCombData.Binding.Hobbits.QQData.Binding.Hobbits.NuElim1Data.Binding.Hobbits.Examples.LambdaLifting.Terms4Data.Binding.Hobbits.Examples.LambdaLifting.Examples+Data.Binding.Hobbits.Examples.LambdaLiftingData.Type.ListData.Binding.Hobbits parsePatternparseVar:++::>Nil proxyConsAppend Append_Step Append_BasetranslengthMember Member_Step Member_BasetoEqweakenLsameweakenRsplitMapCempty singletonlookupmapCappendmkAppend mkMonoAppendproxymembersExProxyExMemberMbMkMbNameMkName memberFromLen unsafeLookupC proxyFromLenunsafeProxyFromLenunsafeNamesFromIntscounter fresh_name Liftable2mbLift2 Liftable1mbLift1LiftablembLiftBindingnu combineMb separateMb mbToProxyemptyMbnuMulti elimEmptyMbcmpName mbNameBoundP mbCmpNamembList SuperComb superComb mbToplevelnuQQ NuElimListnuElimListProofNuElim nuElimProof NuElimProofnuWithElimMulti nuWithElim1 mkNuElimDataDecls Decls_Cons Decls_BaseDecl Decl_ConsDecl_OneDTermTAppTDVarTVarTermAppLamVarDLlamex1ex2ex3ex4ex5ex6ex7exP lambdaLift mbLambdaLift varParser ctorParser infixParser stringParser charParser intToRational numParser litParsercommaSepParser tokenParserwsParser pattParser varOnlyParsertagged-0.2.2.1 Data.ProxyProxytype-equality-0.1.0Data.Type.EqualityRefl:=: unSuperComb isSuperCombinternPattVarssyb_rnfsame_ctxnuQQPatt CxtStateQNamesNuElimDataProof NuElimData NuElimFunNuElimMb NuElimName mapNamesPfmapNamesfst3snd3thd3mkNuElimDataProofOldStringFtprettyprettympretty decls_pretty mdecls_pretty mdecl_pretty LLBodyRetSepRetFVSTermSTermSAppSDVarSVarSWeaken FVUnionRetFVListMbLNameSubCPeelRet AddArrowsLCLType peelLambdas peelLambdasH boundParams freeParamsfvUnionelemMC skelSubstskelAppMultiNames fvSSepLTVars fvSSepLTVarsH raiseAppNamellBody