I think CHR is an underrated programming paradigm and useful for writing type checkers among many other things. The first paragraphs contain a summary of possible applications:
Constraint Handling Rules (CHR) is a rule-based programming language that is usually embedded into a general-purpose programming language. Having a CHR implementation available enables software developers to solve problems in a declarative and elegant manner. Aside from the obvious task of implementing constraint solvers, it can be used to solve scheduling problems, implement concurrent and multi-agent systems, for applications in music and possibly game development. In general, CHR is ideally suited for any problem that involves the transformation of (multi-) sets of data, as programs consist of a set of rewriting rules, hiding away the process of finding suitable candidates for rule application. Hereby, we get a purely declarative representation of the algorithm without the otherwise necessary boilerplate code.