alpha transform
monomorphise
builtin function, value restriction
K-normal form
constant folding
stop monomorphising datatypes
use tag instead of constructor and translate tuples into datatypes in K-normal form
revise contant folding
restore tuples in K-normal form
unused decl elimination
inlining
remove unnecessary GeneralizedNewtypeDeriving
add inlining threshold
add lambda lifter
defunctionalize
support external function declaration