In our case, we did that using functional programming & type-driven design (which ironically is also a TDD.)
Most often I see TDD used as a couch for a really bad type system.
Pure functions help but the principles of generalisation are deeper than this.
Tests verify contracts offline. This will miss real issues.
Can't think of any less functional languages than these.
If you need a template then think of scheme. It is the best example of a minimal functional language.