type expr = union `Add (expr#, expr#) `Mul (expr#, expr#) `Val int ;; cosnt fold = {expr match expr | `Plus (`Val 0, x): -> fold(x) | `Plus (x, `Val 0): -> fold(x) | `Mul (`Val 0, `Val _): -> `Val 0 | `Mul (`Val _, `Val 0): -> `Val 0 | other: -> other ;; } Roughly equivalent to.... enum { Add, Mul, }; struct Expr { int op; union { struct { Expr *left; Expr *right; }; int val; }; }; Expr fold(Expr *e){ switch(op){ case Plus: switch(e->left->op){ case Val: if(e->left->val == 0) return e->right; break; default: switch(e->right->op){ case Val: if(e->right->val == 0) return e->left; break; default: return e; } ...