'Typechecker combinators' Given a syntax tree and an associated type, you can define typechecking rules for each node using a monadic DSL