Some exercises that could be challenging to do, some are easy and some harder. I'll add more of these as I have time.
These exercises use general recursion and is an introduction to functional programming. The first is something that you should have done by the first week. The second is a very good exercise to do before we start on the meta interpreter. The third will show you how recursive thinking can solve quite complex problems.
Operations on a tree
The exercises show how you can implement an advanced tree data structure and its operations using pattern matching. If you not yet comfortable with working with pattern matching these exercises are quite challenging. If you have learned how to think in patterns they are a fun exercise that will show you how powerful pattern matching is. As an added bonus you will learn some fun algorithms.
The first exercise is something that you should do as soon as we start with concurrency. The second exercise introduce concepts as locks, semaphores and monitors. In an actors based language you normally do not think in terms of locks etc but it is important to understand what these concepts are. The third exercise is only if you want to have a challenging project.