From a17d36fe94d53fb7a74dc74129905cba9ac9b7f9 Mon Sep 17 00:00:00 2001 From: "grigorii.kirgizov" Date: Wed, 13 Feb 2019 16:20:24 +0300 Subject: [PATCH] Docs: more adjustments according to appearance on html page --- docs/content/example-lambdacalc-ext.md | 19 +++++++++++++----- .../img/ex-stlc/dataform-table-wider.png | Bin 0 -> 19042 bytes 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 docs/content/img/ex-stlc/dataform-table-wider.png diff --git a/docs/content/example-lambdacalc-ext.md b/docs/content/example-lambdacalc-ext.md index 88e6546f..093cae53 100644 --- a/docs/content/example-lambdacalc-ext.md +++ b/docs/content/example-lambdacalc-ext.md @@ -1,4 +1,13 @@ -# Typechecking Extended Lambda Calculus +--- +layout: page +title: Typechecking Extended Lambda Calculus +menu: Typechecking STLC +parent: examples +weight: 550 +github-path: /tree/master/samples/lambdacalc +--- + +# Typechecking Extended STLC Simply Typed Lambda Calculus (STLC) is a famous example favored by textbook authors. This sample demonstrates how a classical type checking algorithm (Hindley-Milner[^hm]) designed for this language can be implemented using Code Rules. @@ -19,7 +28,7 @@ The required extensions for GHC are: The dataform table is trivial, there're two terms used in Cons-list implementation (`Cons` and `Nil`), term `Constraint` used in the part of type system concerned with typeclasses, and other expected terms for types (`Fun` for function type, `Forall` for universal types etc.). -![DataForm Table](img/ex-stlc/dataform-table.png) +![DataForm Table](img/ex-stlc/dataform-table-wider.png) _(dataform table)_ There is only one query of kind `TYPECHECK`, which launches types recovery. All the type checking is done by the automatic productions “on start”. @@ -27,7 +36,7 @@ There is only one query of kind `TYPECHECK`, which launches types recovery. All -## Basic Hindley-Milner Type Inference +### Basic Hindley-Milner Type Inference The basic type inference is covered by the several handlers: handler `typeOf` that contains most of the typing rules, handler `forall` covers typing of universal types, `recover` handler is concerned with translating inferred types back to SNodes representation, and `consList` is an utility handler. @@ -199,7 +208,7 @@ Next, we turn our attention to the extensions to STLC. -## Type Annotations +### Type Annotations Extension of STLC with type annotations demonstrates two important points: a usage of Code Rules macros and an implementation of a relation between types in the form of constraint. Relations on types are present in many type systems, and probably the most widespread example is a subtyping relation (e.g. `isSubtype(type1, type2)`). As a matter of fact, the `subsumed` relation, presented here, is a form of subtyping too, as explained below. @@ -368,7 +377,7 @@ That's how implementation of a complex relation on types can look like in Code R -## Typeclasses +### Typeclasses Haskell typeclasses are one of the most important and complex features of its type system, that distinguishes Haskell among other well-known functional languages. Implementing typeclasees using Code Rules shows that it has expressive power that is sufficient even for the advanced type systems. diff --git a/docs/content/img/ex-stlc/dataform-table-wider.png b/docs/content/img/ex-stlc/dataform-table-wider.png new file mode 100644 index 0000000000000000000000000000000000000000..cecec79c2949dbbcbceefcf53862734f40b89ba9 GIT binary patch literal 19042 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 Q-x38#iOE5VMfE@ZH<*D;mjD0& literal 0 HcmV?d00001