I did a calculator implementation for my PL class:
http://www.cs.bu.edu/~hwxi/academic/courses/CS320/Spring13/code/calculator/
The implementation per se is not that interesting (I did not get to use
advanced types to do more static checking). However, the programming style
of this implementation is what I can recommend highly.
Say you want to do a project xyz; you first create a file named xyz.sats;
then you introduce in xyz.sats abstract types corresponding to various
concepts in your project (abstract types are kind of like classes); say you
have an abstype foo; you create a file xyz_foo.dats and implement in it the
abstype foo plus some related functions. This style is easy to learn and it
works super-effectively in practice. To me, properly using abstract types
(instead of concrete types) is by far the most important programming skill
a competent programmer should master.