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
|
#### Checking More Expressions
|
||||||
So far, we've only checked types of numbers, applications, and variables.
|
So far, we've only checked types of numbers, applications, and variables.
|
||||||
Our language has more than that, though!
|
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