Fix issues in typesafe interpreter article.
This commit is contained in:
parent
020417e971
commit
49469bdf12
|
@ -30,7 +30,7 @@ impossible to manually test every possible case in our typechecker,
|
|||
but our approach of returning `Dec (a = b)` will work just fine.
|
||||
|
||||
### Extending The Syntax
|
||||
First, let's extend our existing language with expressions fpr
|
||||
First, let's extend our existing language with expressions for
|
||||
tuples. For simplicity, let's use pairs `(a,b)` instead of general
|
||||
`n`-element tuples. This would make typechecking less cumbersome while still
|
||||
having the interesting effect of making the number of types in our language
|
||||
|
@ -46,7 +46,7 @@ Our `Expr` data type, which allows ill-typed expressions, ends up as follows:
|
|||
I've highlighted the new lines. The additions consist of the `Pair` constructor, which
|
||||
represents the tuple expression `(a, b)`, and the `Fst` and `Snd` constructors,
|
||||
which represent the `fst e` and `snd e` expressions, respectively. In
|
||||
a similar vein, we extend our `SafeExpr` GADT:
|
||||
a similar manner, we extend our `SafeExpr` GADT:
|
||||
|
||||
{{< codelines "Idris" "typesafe-interpreter/TypesafeIntrV3.idr" 41 49 "hl_lines=7 8 9" >}}
|
||||
|
||||
|
@ -93,7 +93,7 @@ Lines 14 through 16 are pretty simple; in this case, we can tell at a glance
|
|||
that the two types are equal, and Idris can infer an equality proof in
|
||||
the form of `Refl`. We return this proof by writing it in a `Just`.
|
||||
Line 23 is the catch-all case for any combination of types we didn't handle.
|
||||
Any combination of types we don't handle is false, and thus, this case
|
||||
Any combination of types we don't handle is invalid, and thus, this case
|
||||
returns `Nothing`.
|
||||
|
||||
What about lines 17 through 22? This is the case for handling the equality
|
||||
|
@ -131,7 +131,7 @@ we want to substitute? After all, of the following are possible:
|
|||
|
||||
```Idris
|
||||
PairType rt1 lt2 = PairType lt1 lt2 -- First lt1 replaced
|
||||
PairType lt1 lt2 = PairType rt1 lt2 -- Second lt2 replaced
|
||||
PairType lt1 lt2 = PairType rt1 lt2 -- Second lt1 replaced
|
||||
PairType rt1 lt2 = PairType rt1 lt2 -- Both replaced
|
||||
```
|
||||
|
||||
|
@ -147,7 +147,7 @@ t1 => PairType lt1 lt2 = PairType t1 lt2
|
|||
t1 => PairType t1 lt2 = PairType t1 lt2
|
||||
```
|
||||
|
||||
The highlighted function is the one we'll need to use to attain
|
||||
The second function (highlighted) is the one we'll need to use to attain
|
||||
the desired result. Since `P` is an implicit argument to `replace`,
|
||||
we can explicitly provide it with `{P=...}`, leading to the following
|
||||
line:
|
||||
|
|
Loading…
Reference in New Issue
Block a user