This paper explores how design patterns could be revisited in the era of
mainstream functional programming languages. I discuss the kinds of knowledge
that ought to be represented as functional design patterns: architectural
concepts that are relatively self-contained, but whose entirety cannot be
represented as a language-level abstraction. I present four concrete examples
embodying this idea: the Witness, the State Machine, the Parallel Lists, and
the Registry. Each pattern is implemented in Rust to demonstrate how careful
use of a sophisticated type system can better model each domain construct and
thereby catch user mistakes at compile-time.