You've probably heard the phrase "code as data" before. It's actually a fairly simple concept and can be used to build powerful abstractions in your code.
Test-driven development often doesn't take advantage of strong type systems. In this post I show how Kent Beck's Money example can be improved with types.
Test-driven development started with dynamic, object-oriented languages. Does TDD work with static types? Yes, but types should replace tests when possible.