

@ 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 illtyped 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" "typesafeinterpreter/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 catchall 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: 


