Constraint Types
type ErrorMessage = Lazy<string>
type Constraint = Equal of TyExpr * TyExpr * ErrorMessage
| And of Constraint * Constraint
| Trivial
let (=~=) q1 q2 err = Equal (q1, q2, err)
let (&&&) c1 c2 = And (c1, c2)
let rec conjoinConstraints cc =
match cc with
| [] -> Trivial
| [c] -> c
| c::cs -> c &&& (conjoinConstraints cs)