Skip to content

Instantly share code, notes, and snippets.

@zehnpaard
Last active October 4, 2022 02:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zehnpaard/f1aa570715dacab7d0de26bdcb9d033b to your computer and use it in GitHub Desktop.
Save zehnpaard/f1aa570715dacab7d0de26bdcb9d033b to your computer and use it in GitHub Desktop.
Simple Bool from Types and Programming Languages, simplified based on https://github.com/hsk/simpletapl
type ty =
| TArrow of ty * ty
| TBool
type exp =
| EVar of string
| EAbs of string * ty * exp
| EApp of exp * exp
| ETrue
| EFalse
| EIf of exp * exp * exp
let rec typeof env = function
| EVar var -> List.assoc var env
| EAbs(var, t1, e1) -> TArrow(t1, typeof ((var,t1)::env) e1)
| EApp(e1, e2) ->
(match typeof env e1 with
| TArrow(t11, t12) where t11 = typeof env e2 -> t12
| TArrow _ -> failwith "parameter type mismatch"
| _ -> failwith "non-arrow type in function position")
| ETrue | EFalse -> TBool
| EIf(e1,e2,e3) ->
if typeof env e1 != TBool
then failwith "guard of conditional not boolean"
else
let t2 = typeof env e2 in
if typeof env e3 != t2 then failwith "type mismatch in arms of conditional"
else t2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment