Start working on case expression rule
This commit is contained in:
parent
a9958edaa2
commit
cfb4fc708a
|
@ -243,3 +243,49 @@ types that satisfy the rules.
|
|||
#### Checking More Expressions
|
||||
So far, we've only checked types of numbers, applications, and variables.
|
||||
Our language has more than that, though!
|
||||
|
||||
Binary operators are by far the simplest to extend our language with;
|
||||
We can simply say that `(+)` is a function, `Int -> Int -> Int`, and
|
||||
`x+y` is the same as `(+) x y`. This way, we simply translate
|
||||
operators into function application, and the same typing rules apply.
|
||||
|
||||
Next up, we have case expressions. This is one of the two places
|
||||
where we will introduce new variables into the context, and
|
||||
also a place where we will need several rules.
|
||||
|
||||
Let's first take a look at the whole case expression rule:
|
||||
{{< todo >}} Double check squiggly notation. {{< /todo >}}
|
||||
$$
|
||||
\\frac
|
||||
{\\Gamma \\vdash e : \\tau \\quad \\tau | p\_i \\leadsto b\_i \\quad \\Gamma,b\_i \\vdash e\_i : \\tau\_c}
|
||||
{\\Gamma \\vdash \\text{case} \\; e \\; \\text{of} \; \\\{ (p\_1,e\_1) \\ldots (p\_n, e\_n) \\\} : \\tau\_c }
|
||||
$$
|
||||
This is a lot more complicated than the other rules we've seen, and we've used some notation
|
||||
that we haven't seen before. Let's take this step by step:
|
||||
|
||||
1. \\(e : \\tau\\), in this case, means that the expression between `case` and `of`, is of type \\(\\tau\\).
|
||||
2. \\(\\tau | p\_i \\leadsto b\_i\\) means that the pattern \\(p\_i\\) can match a value of type
|
||||
\\(\\tau\\), producing additional type pairs \\(b\_i\\). We need \\(b\_i\\) because a pattern
|
||||
such as `Cons x xs` will introduce new type information, namely \\(\text{x} : \text{Int}\\) and \\(\text{xs} : \text{List}\\).
|
||||
3. \\(\\Gamma,b\_i \\vdash e\_i : \\tau\_c\\) means that each individual branch can be deduced to have the type
|
||||
\\(\\tau\_c\\), using the previously existing context \\(\\Gamma\\), with the addition of \\(b\_i\\), the new type information.
|
||||
4. Finally, the conclusion is that the case expression, if all the premises are met, is of type \\(\\tau\_c\\).
|
||||
|
||||
For completeness, let's add rules for \\(\\tau | p\_i \\leadsto b\_i\\). We'll need two: one for
|
||||
the "basic" pattern, which always matches the value and binds it to the variable, and one
|
||||
for a constructor pattern, that matches a constructor and its parameters.
|
||||
|
||||
Let's define \\(v\\) to be a variable name in the context of a pattern. For the basic pattern:
|
||||
$$
|
||||
\\frac
|
||||
{}
|
||||
{\\tau | v \\leadsto \\\{v : \\tau \\\}}
|
||||
$$
|
||||
|
||||
{{< todo >}} consult pierce. {{< /todo >}}
|
||||
The rule for the constructor pattern, then, is:
|
||||
$$
|
||||
\\frac
|
||||
{}
|
||||
{}
|
||||
$$
|
||||
|
|
Loading…
Reference in New Issue
Block a user