From 64c7b6879f3fcecd187ea92e604444a4befb18cb Mon Sep 17 00:00:00 2001 From: Cyrus Omar Date: Tue, 5 May 2020 15:19:10 -0400 Subject: [PATCH 01/10] add outline for type aliases PHI --- 2-type-aliases/2-type-aliases.md | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 2-type-aliases/2-type-aliases.md diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md new file mode 100644 index 0000000..d7f4a0c --- /dev/null +++ b/2-type-aliases/2-type-aliases.md @@ -0,0 +1,49 @@ +# Motivation +TODO: describe motivation + +# Overview +TODO: provide an overview + +# Proposed Changes +TODO: in all subsections, write which files you expect to change or add in the implementation. For example: + + Files to be changed: + * `UHExp.re` -- short summary of the changes you plan to make + +## Singleton Kind System +### Kind Checking +TODO: describe the kind system + +### Type Equivalence +TODO: describe how type equivalence should work + +## Expression Language +TODO: we are adding a new line item for type aliases + + TODO: propose the syntax + TODO: what are the semantics + +## Type-Level Language +### Type Variables +TODO: propose the change to UHTyp.t (make sure you consider invalid type variables) + + TODO: writing down the kinding rules for kind inconsistencies and invalid type variables + +TODO: propose the change to HTyp.t (see polymorphism branch, Charles Chamberlain) +TODO: how will Action module change + +## Pattern Language +The pattern language will not change. + +## Dynamic Semantics +TODO: does this need any changes? + +## User Interface +### Key Bindings +TODO: should be able to use existing mechanisms for the most part, but summarize approach + +### Cursor Inspector +TODO: adding new error messages for kind inconsistencies and invalid type variables + +### Pretty Printer +TODO: adding support for new constructs From 93bf0a6c7afa9d645c34905ed439b957ffd11f3b Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Tue, 5 May 2020 19:18:55 -0400 Subject: [PATCH 02/10] update README.md as in master --- README.md | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1a01747..eab29db 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,19 @@ # Creating a Proposal for Hazel Improvement (PHI) -* Create a new directory with a short name, e.g. `#-labeled-tuples`, where `#` is the next unused number starting at 1. -* Create a `#-labeled-tuples.md` file in that directory with the proposal in it. -* We may require a specific format in the future. +* Clone this repository. +* Determine the number and name for your PHI: + * The number should be the next available number. To determine the next available number, look at: + + 1. the existing directories in master; and + 2. the list of branches on GitHub. + + Make sure you are not using the same number as somebody else. + + * The name should be a dash-separated sequence of lowercase letters. +* We will be using the GitHub pull request system to review your proposal before it is accepted into master. Create a new branch named `#-name` where `#` is your PHI number and `name` is the name you chose. +* Create a new directory named `#-name`. +* Create a new file named `#-name.md` in that directory. +* Push your new branch to GitHub immediately so that there are not number choice clashes. +* We may provide an outline for PHIs in the future, but for now consult with cyrus- or others in FP Lab. + +# Pronunciation +PHI is pronounced however you'd like to pronounce the greek letter "phi" (like "pie" or "fee"). From 491993e614e93ccb7893d6254d0e9ea55a7058fa Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Thu, 7 May 2020 02:52:32 -0400 Subject: [PATCH 03/10] finish Motivation --- 2-type-aliases/2-type-aliases.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index d7f4a0c..5e0fb22 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -1,5 +1,8 @@ # Motivation -TODO: describe motivation + +**Type aliases** give users ability to define a shorthand for another type, which is either a user defined type or primitive type. As for benifits, type aliases can reduce the amount of typing as well as increasing the readability of code. + +Moreover, most of pupolar programming languages provide this feature such as `typedef` in C/C++ and [type synonym](https://wiki.haskell.org/Type_synonym) feature in Haskell. # Overview TODO: provide an overview From cf71c725a55fa90a6878542f39cdc327475cf0e3 Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Tue, 19 May 2020 01:34:13 -0400 Subject: [PATCH 04/10] add keybindings --- 2-type-aliases/2-type-aliases.md | 46 ++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index 5e0fb22..36fae77 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -8,10 +8,6 @@ Moreover, most of pupolar programming languages provide this feature such as `ty TODO: provide an overview # Proposed Changes -TODO: in all subsections, write which files you expect to change or add in the implementation. For example: - - Files to be changed: - * `UHExp.re` -- short summary of the changes you plan to make ## Singleton Kind System ### Kind Checking @@ -21,10 +17,24 @@ TODO: describe the kind system TODO: describe how type equivalence should work ## Expression Language -TODO: we are adding a new line item for type aliases + Files to change: + * `UHExp.re` : add line item + * `ZExp.re` : add line item +### `UHExp.re` : +To support type alias, we need to add a new line item to the language and the proposed syntax is + +`DefLine(TVar.t, UHTyp.t)` for abstract syntax + +`define t is type in e` for GUI syntax + +### `ZExp.re` : +By considering the cursor positions of `DefLine`, we need to add two more zline items which are + +`DefLineT(TVar.t, ZTyp.t)` (when cursor is on the type) + +### Semantics +The static semantics of this expression is that type variable `t` will be classified as `S(type)` in the type variable context. The result is `t` will be definitionally equivalent to `type` in expression `e`. - TODO: propose the syntax - TODO: what are the semantics ## Type-Level Language ### Type Variables @@ -43,7 +53,27 @@ TODO: does this need any changes? ## User Interface ### Key Bindings -TODO: should be able to use existing mechanisms for the most part, but summarize approach + +#### Files to change: +* `ExpandingKeyword.re` : add a new keyword +* `Actionre.re` : add new shape + +For the keyboard interactions, we will handle the construt of the `DefLine` the same way as the `LetLine`. As a result, when cursor is at a place where expression is expected, if user type "define" and then hit space, we will expand the line to an `DefLine`. + +#### `ExpandingKeyword.re` : +1. For `ExpandingKeyword.t`, we need to add define keyword + + type t = ... + | Define +2. Update other functions accordingly + +#### `Action.re` : +1. For `Action.shape`, we need to add new shape define + + type shape = ... + | SDefine + +2. Update other functions and utilities. ### Cursor Inspector TODO: adding new error messages for kind inconsistencies and invalid type variables From dd27f49d42b89108668d9279560b766f5a6772bb Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Tue, 19 May 2020 03:37:38 -0400 Subject: [PATCH 05/10] add overview --- 2-type-aliases/2-type-aliases.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index 36fae77..a8144fb 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -1,3 +1,11 @@ +TODO: +1. overview - done +2. kind system +3. type equivalence +4. type variable +5. cursor inspector +6. pretty printer + # Motivation **Type aliases** give users ability to define a shorthand for another type, which is either a user defined type or primitive type. As for benifits, type aliases can reduce the amount of typing as well as increasing the readability of code. @@ -5,7 +13,9 @@ Moreover, most of pupolar programming languages provide this feature such as `typedef` in C/C++ and [type synonym](https://wiki.haskell.org/Type_synonym) feature in Haskell. # Overview -TODO: provide an overview +To be able to define type aliases, fisrt we need to introduce a **kind system** to classify type constructors including the singleton kind which is used to express the type aliases. Second, we need to be able to construct **type variables** to stand for some type. + +Also, for a good user experience, new error messages for cursor inspector is needed. For the pretty printer, we also need to support the new syntax. # Proposed Changes From d150da51171adddab3ac783a8ba026a305f86201 Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Tue, 19 May 2020 05:39:47 -0400 Subject: [PATCH 06/10] fix spell error --- 2-type-aliases/2-type-aliases.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index a8144fb..1fe72f1 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -8,12 +8,12 @@ TODO: # Motivation -**Type aliases** give users ability to define a shorthand for another type, which is either a user defined type or primitive type. As for benifits, type aliases can reduce the amount of typing as well as increasing the readability of code. +**Type aliases** give users ability to define a shorthand for another type, which is either a user defined type or primitive type. As for benefits, type aliases can reduce the amount of typing as well as increasing the readability of code. -Moreover, most of pupolar programming languages provide this feature such as `typedef` in C/C++ and [type synonym](https://wiki.haskell.org/Type_synonym) feature in Haskell. +Moreover, most of popular programming languages provide this feature such as `typedef` in C/C++ and [type synonym](https://wiki.haskell.org/Type_synonym) feature in Haskell. # Overview -To be able to define type aliases, fisrt we need to introduce a **kind system** to classify type constructors including the singleton kind which is used to express the type aliases. Second, we need to be able to construct **type variables** to stand for some type. +To be able to define type aliases, first we need to introduce a **kind system** to classify type constructors including the singleton kind which is used to express the type aliases. Second, we need to be able to construct **type variables** to stand for some type. Also, for a good user experience, new error messages for cursor inspector is needed. For the pretty printer, we also need to support the new syntax. @@ -21,8 +21,20 @@ Also, for a good user experience, new error messages for cursor inspector is nee ## Singleton Kind System ### Kind Checking -TODO: describe the kind system +Here we introduce a kind system for Hazel: + type t ::= ... + and + kind k ::= Type + | Unit + | Prod(k, k) + | Arrow(k, k) + | Sum(k, k) + | Singleton(t) + +Here, we can see the kind and type systems are defined in a mutually recursive manner. + +We use `Type` to classify Bool, Int, Float and Hole (?) and use `Unit` and `Prod` to classify the product type and unit type. Also, we use `Sum` to classify sum type. Finally, we use `Singleton` kind to express type alias for type constructor `t`. ### Type Equivalence TODO: describe how type equivalence should work @@ -68,7 +80,7 @@ TODO: does this need any changes? * `ExpandingKeyword.re` : add a new keyword * `Actionre.re` : add new shape -For the keyboard interactions, we will handle the construt of the `DefLine` the same way as the `LetLine`. As a result, when cursor is at a place where expression is expected, if user type "define" and then hit space, we will expand the line to an `DefLine`. +For the keyboard interactions, we will handle the construct of the `DefLine` the same way as the `LetLine`. As a result, when cursor is at a place where expression is expected, if user type "define" and then hit space, we will expand the line to an `DefLine`. #### `ExpandingKeyword.re` : 1. For `ExpandingKeyword.t`, we need to add define keyword From aca72cfe762d1a0833bdef0046b6e7efcdc975d7 Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Tue, 19 May 2020 06:18:44 -0400 Subject: [PATCH 07/10] some portion of type variable --- 2-type-aliases/2-type-aliases.md | 39 ++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index 1fe72f1..85f80ac 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -15,12 +15,37 @@ Moreover, most of popular programming languages provide this feature such as `ty # Overview To be able to define type aliases, first we need to introduce a **kind system** to classify type constructors including the singleton kind which is used to express the type aliases. Second, we need to be able to construct **type variables** to stand for some type. -Also, for a good user experience, new error messages for cursor inspector is needed. For the pretty printer, we also need to support the new syntax. +Moreover, new error messages for cursor inspector is needed. For the pretty printer, we also need to support the new syntax. # Proposed Changes +## Type-Level Language +### Type Variables + +To support type alias, first we need to support type variable in our type level language. + +Files to change : + * `UHTyp.re` : add support for type variable + * `HTyp.re` : add support for type variable + * We need to support type variable context Delta + * `Action.re` : be able to construct and use type variable + +#### `HTyp.re` : +TODO: propose the change to HTyp.t (see polymorphism branch, Charles Chamberlain) + +#### `UHTyp.re` : +TODO: propose the change to UHTyp.t (make sure you consider invalid type variables) + + TODO: writing down the kinding rules for kind inconsistencies and invalid type variables + + +TODO: how will Action module change + +#### `Action.re` : ## Singleton Kind System -### Kind Checking +File to change: + * `HTyp.re` + Here we introduce a kind system for Hazel: type t ::= ... @@ -57,16 +82,6 @@ By considering the cursor positions of `DefLine`, we need to add two more zline ### Semantics The static semantics of this expression is that type variable `t` will be classified as `S(type)` in the type variable context. The result is `t` will be definitionally equivalent to `type` in expression `e`. - -## Type-Level Language -### Type Variables -TODO: propose the change to UHTyp.t (make sure you consider invalid type variables) - - TODO: writing down the kinding rules for kind inconsistencies and invalid type variables - -TODO: propose the change to HTyp.t (see polymorphism branch, Charles Chamberlain) -TODO: how will Action module change - ## Pattern Language The pattern language will not change. From c2f5cc0bd1c18a1cbfe78a5a185a8ed042857f7c Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Tue, 19 May 2020 14:20:22 -0400 Subject: [PATCH 08/10] add kind formation and type equivalence --- 2-type-aliases/2-type-aliases.md | 62 ++++++++++++++++++---------- 2-type-aliases/kind_equivalence.jpg | Bin 0 -> 21892 bytes 2-type-aliases/kind_formation.jpg | Bin 0 -> 3739 bytes 3 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 2-type-aliases/kind_equivalence.jpg create mode 100644 2-type-aliases/kind_formation.jpg diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index 85f80ac..860b845 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -1,10 +1,5 @@ -TODO: -1. overview - done -2. kind system -3. type equivalence -4. type variable -5. cursor inspector -6. pretty printer + +[TODO: type equivalence, type variable, cursor inspector and pretty printer]: # # Motivation @@ -18,6 +13,10 @@ To be able to define type aliases, first we need to introduce a **kind system** Moreover, new error messages for cursor inspector is needed. For the pretty printer, we also need to support the new syntax. # Proposed Changes +## Pattern Language +Need to add support for type pattern, see [proposal 3](https://github.com/hazelgrove/phi/blob/3-explicit-polymorphism/3-explicit-polymorphism/3-explicit-polymorphism.md). + + ## Type-Level Language ### Type Variables @@ -26,11 +25,18 @@ To support type alias, first we need to support type variable in our type level Files to change : * `UHTyp.re` : add support for type variable * `HTyp.re` : add support for type variable - * We need to support type variable context Delta + * We need to support type variable context Delta which is used to which variable is of which kind (v : k). * `Action.re` : be able to construct and use type variable -#### `HTyp.re` : -TODO: propose the change to HTyp.t (see polymorphism branch, Charles Chamberlain) +#### `HTyp.re` : + +[TODO: propose the change to HTyp.t (see polymorphism branch, Charles Chamberlain)]: # + +We will use de Bruijn indices to represent a type variable, which is the same for current [polymorphism branch](https://github.com/hazelgrove/hazel/blob/polymorphism/src/semantics/HTyp.re). + + type t ::= ... + | TVar(idx, Var.t) /* bounded type variable */ + | TVarHole(Meta.t, Var.t) /* free type variable */ #### `UHTyp.re` : TODO: propose the change to UHTyp.t (make sure you consider invalid type variables) @@ -38,11 +44,12 @@ TODO: propose the change to UHTyp.t (make sure you consider invalid type variabl TODO: writing down the kinding rules for kind inconsistencies and invalid type variables -TODO: how will Action module change - #### `Action.re` : +TODO: how will Action module change ## Singleton Kind System +*The reference of this part is [PFPL 2nd edition](https://www.cs.cmu.edu/~rwh/pfpl/2nded.pdf) chapter 18 and chapter 43.* + File to change: * `HTyp.re` @@ -51,6 +58,7 @@ Here we introduce a kind system for Hazel: type t ::= ... and kind k ::= Type + | Hole | Unit | Prod(k, k) | Arrow(k, k) @@ -59,9 +67,22 @@ Here we introduce a kind system for Hazel: Here, we can see the kind and type systems are defined in a mutually recursive manner. -We use `Type` to classify Bool, Int, Float and Hole (?) and use `Unit` and `Prod` to classify the product type and unit type. Also, we use `Sum` to classify sum type. Finally, we use `Singleton` kind to express type alias for type constructor `t`. -### Type Equivalence -TODO: describe how type equivalence should work +We use `Type` to classify Bool, Int, Float and use `Hole` to classify Hole. For algebraic type, we use `Unit` and `Prod` to classify the product type and unit type and use `Sum` to classify sum type. Finally, we use `Singleton` kind to express type alias for type constructor `t`. + +Note: ask if it's possible to use `Prod(list(k))` for implementation of kind by considering the current implementation of `HTyp.re`. + +### Kind formation + + +Since the `Singleton` kind is a dependent kind, it is a valid kind when its argument is a valid type, thus the rule is given by + +![kind formation](./kind_formation.jpg) + +### Kind Equivalence +The rules for kind equivalence are given below: +![kind equivalence](./kind_equivalence.jpg) + + ## Expression Language Files to change: @@ -70,23 +91,22 @@ TODO: describe how type equivalence should work ### `UHExp.re` : To support type alias, we need to add a new line item to the language and the proposed syntax is -`DefLine(TVar.t, UHTyp.t)` for abstract syntax +`DefLine(TPat.t, UHTyp.t)` for abstract syntax `define t is type in e` for GUI syntax ### `ZExp.re` : By considering the cursor positions of `DefLine`, we need to add two more zline items which are -`DefLineT(TVar.t, ZTyp.t)` (when cursor is on the type) +`DefLineT(TPat.t, ZTyp.t)` (when cursor is on the type) + +`DefLineP(ZTPat.t, UHTyp.t)` (when cursor is on the type pattern) ### Semantics The static semantics of this expression is that type variable `t` will be classified as `S(type)` in the type variable context. The result is `t` will be definitionally equivalent to `type` in expression `e`. -## Pattern Language -The pattern language will not change. - ## Dynamic Semantics -TODO: does this need any changes? +The dynamic semantics will not be changes, the type checking for the singleton kind is performed at static time. ## User Interface ### Key Bindings diff --git a/2-type-aliases/kind_equivalence.jpg b/2-type-aliases/kind_equivalence.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d55682601c5f9a34fe4f9332b5b510b2c1214766 GIT binary patch literal 21892 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%0A}!!-FIE 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 Zkz4aWNWIUX)A})b4`mE8`|SVU1OR`JI+6eY literal 0 HcmV?d00001 diff --git a/2-type-aliases/kind_formation.jpg b/2-type-aliases/kind_formation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8506dfd2ffc399c8daf0153ffb0b3ca3ff5aed8c GIT binary patch literal 3739 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 KJ^uINe) Date: Tue, 19 May 2020 14:29:42 -0400 Subject: [PATCH 09/10] kind equivalence --- 2-type-aliases/2-type-aliases.md | 2 +- 2-type-aliases/kind_equivalence.jpg | Bin 21892 -> 25611 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index 860b845..e2b5373 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -79,7 +79,7 @@ Since the `Singleton` kind is a dependent kind, it is a valid kind when its argu ![kind formation](./kind_formation.jpg) ### Kind Equivalence -The rules for kind equivalence are given below: +Kind equivalence will be reflective, symmetric, transitive and closed under kind formation. Also, two singleton kind are equivalent at kind level if their arguments types are consistent at type level. The rules for kind equivalence are given below: ![kind equivalence](./kind_equivalence.jpg) diff --git a/2-type-aliases/kind_equivalence.jpg b/2-type-aliases/kind_equivalence.jpg index d55682601c5f9a34fe4f9332b5b510b2c1214766..5a18f743ff2b26d43cc0e0d13a755b0e9412acd2 100644 GIT binary patch literal 25611 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%0D>@@<1lJUu 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%0A}!!-FIE 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 Zkz4aWNWIUX)A})b4`mE8`|SVU1OR`JI+6eY From d97cd18cd551390569fb9126446c3f05a73f55c1 Mon Sep 17 00:00:00 2001 From: Yuning30 <46411193+Yuning30@users.noreply.github.com> Date: Tue, 19 May 2020 14:36:08 -0400 Subject: [PATCH 10/10] make kind a single file --- 2-type-aliases/2-type-aliases.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/2-type-aliases/2-type-aliases.md b/2-type-aliases/2-type-aliases.md index e2b5373..c0fde09 100644 --- a/2-type-aliases/2-type-aliases.md +++ b/2-type-aliases/2-type-aliases.md @@ -51,21 +51,17 @@ TODO: how will Action module change *The reference of this part is [PFPL 2nd edition](https://www.cs.cmu.edu/~rwh/pfpl/2nded.pdf) chapter 18 and chapter 43.* File to change: - * `HTyp.re` + * `HKind.re` Here we introduce a kind system for Hazel: - type t ::= ... - and - kind k ::= Type + type t ::= Type | Hole | Unit | Prod(k, k) | Arrow(k, k) | Sum(k, k) - | Singleton(t) - -Here, we can see the kind and type systems are defined in a mutually recursive manner. + | Singleton(HTyp.t) We use `Type` to classify Bool, Int, Float and use `Hole` to classify Hole. For algebraic type, we use `Unit` and `Prod` to classify the product type and unit type and use `Sum` to classify sum type. Finally, we use `Singleton` kind to express type alias for type constructor `t`.