There are a number of projects which would be worthy exercises in functional programming. Scheme may be a good choice. Custom Design a language.
Compilers Create a compiler to convert one language to another.
The source can be a functional language, a procedural language, or even a more primitive language such as a VM language such as PostScript, or even a real machine language, such as PostScript, or 80x86 assembly language. The target language can also be any one of those languages. A monad can be used to provide state so that the reference type in ML is not needed. Persistence Persistent objects can be created, but they don't disappear until they are explicitly destroyed. The objects are held in a sort of database even while the language or the controlling program is not running.