:: SETVARIANTS prototype ::
#
(X⟿Y indicates that X is syntactic sugar for Y)
PATTERNS
p ::= `tag (variant w/o argument)
`tag p (variant with argument)
p & p (intersection)
p as x (capture) [ ⟿ p & x]
p | p (union)
(p, p) (pair)
[p; ...; p] (list)
p :: p (consed list)
[] (empty list)
() (unit)
fun (captures any function)
_ (wildcard)
x (capture variable)
b (boolean constant)
n (numeric constant)
EXPRESSIONS
e ::= \ p ... p . e (functions)
fun p ... p -> e
recfun f p ... p -> e (recursive functions)
function p -> e | ... | p -> e (functions by cases)
function | p -> e | ... | p -> e
recfunction f p -> e | ... | p -> e (recursive functions by cases)
recfunction f | p -> e | ... | p -> e
match e with p -> e | ... | p -> e (match)
match e with | p -> e | ... | p -> e
let p = e in e (let)
let f p ... p = e in e (let function)
let rec f p ... p = e in e (let recursive function)
if e then e else e (if then else)
e e (application)
`tag (variant w/o argument)
`tag e (variant with argument)
(e, e) (pair)
[] (empty list) [ ⟿ `Nil]
e :: e (consed list) [ ⟿ `Cons(e,e)]
[e;...; e] (list) [ ⟿ `Cons(e,...,`Cons(e,`Nil))]
() (unit)
b (boolean constant)
n (numeric constant)
x (variable)
p (primitive function)
PRIMITIVE FUNCTIONS (prefixed)
p ::= eq (equality)
succ (successor function)
add (integer sum)
sub (integer subtraction)
mul (integer multiplication)
div (integer division, fails if dividing by 0)
safe_div ("safe" integer division: 2nd argument must not be 0)
TOP LEVEL DEFINITIONS
e
let x = e
let f p ... p = e ⟿ let f = fun p ... p -> e
let rec f p ... p = e ⟿ let f = recfun f p ... p -> e
let rec f = function ... ⟿ let f = recfunction f ...
TYPES
t ::= 'a (type variables)
Bool (booleans)
Int (arbitrary precision integers)
Caml_Int (integers)
b (singleton [booleans])
n (singleton [integers])
`unit (unit)
`Nil (empty list)
`Cons(t,t) (consed lists)
n--n (intervals of integers)
X (type recursion variable)
t WHERE X = t (recursive type)
t->t (functions)
(t,t) (products)
t|t (union)
t&t (intersection)
t\t (difference)
Empty (empty type)
Any (top type)
Arrow (all functions type) [⟿ Empty->Any]
[* NOTE: an 'a list is encoded as X where X = `Cons('a,X)|`Nil *]
INFO
Enter at the command prompt an expression or statement according to the grammar given below the editor (mostly a subset of OCaml) and end it with a carriage return (SHIFT+enter for a line feed).
You can also click on the examples below to insert them.
(examples from the paper)
let id x = x
id `A
let f x = match x with `A -> true
f (id `A)
let id2 x = match x with `A | `B -> x
id2 `A
let f x = match id2 x with `A -> `B | y -> y
let g x = match x with `A -> id2 x | _ -> x
let f x = match x with | (`A, _) -> 1 | (`B, _) -> 2 | (_, `A) -> 3 | (_, `B) -> 4
function `A -> `B | x -> x
(other examples)
let rec map f = function | [] -> [] | h::t -> (f h)::(map f t);;
map (\x.x);;
map (function `A -> `B | x -> x);;
map (function `A -> `B | x -> x)[`A ; `B ; `B ];;
map (function `A -> `B | x -> x)[`A ; `B ; true ; false ];;
let reverse l =
let rec reverse_aux acc = function
| [] -> acc
| h :: t -> reverse_aux (h :: acc) t
in reverse_aux [] l
reverse [true ; false ; true ; true ]
reverse [1 ; 2 ; 3 ]
reverse [1 ; 2 ; 42 ; 3]
map reverse;;
(* of type ('a list) list -> ('a list) list *)
let l1 = [1; 2; 4] in
let l2 = [ true; false; 3; (\x.x) ] in
map reverse [ l1; l2]
(* of type (( ('a->'a) | Bool | 1--4 ) list) list *)
let g = function
| (`A,`B) -> true
| (`B,`A) -> false;;
map g;;