Implementing an algorithm to calculate the Smith normal form
This is an bottom up approach using no other libraries other than the standard libraries, for practice.
The challenge is to write the algorithm in a functional language from an inherently imperative specification (which uses 'goto'!). On the way I noticed that Lenses come in pretty handily for 'focusing' and mutating on parts of the structure in an elegant manner.