Skip to content

Instantly share code, notes, and snippets.

@artemkin
Created May 26, 2015 08:52
Show Gist options
  • Save artemkin/d56f96626d58065551e4 to your computer and use it in GitHub Desktop.
Save artemkin/d56f96626d58065551e4 to your computer and use it in GitHub Desktop.
GADT based integer/boolean evaluator
type _ expr =
| Int_lit : int -> int expr
| Bool_lit : bool -> bool expr
| Add : int expr * int expr -> int expr
| Sub : int expr * int expr -> int expr
| Mul : int expr * int expr -> int expr
| Div : int expr * int expr -> int expr
| Lt : int expr * int expr -> bool expr
| Gt : int expr * int expr -> bool expr
| And : bool expr * bool expr -> bool expr
| Or : bool expr * bool expr -> bool expr
let rec eval : type a. a expr -> a = function
| Int_lit n -> n
| Bool_lit n -> n
| Add (a, b) -> (eval a) + (eval b)
| Sub (a, b) -> (eval a) - (eval b)
| Mul (a, b) -> (eval a) * (eval b)
| Div (a, b) -> (eval a) / (eval b)
| Lt (a, b) -> (eval a) < (eval b)
| Gt (a, b) -> (eval a) > (eval b)
| And (a, b) -> (eval a) && (eval b)
| Or (a, b) -> (eval a) || (eval b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment