This course is great, and probably my favourite that Ive done so far. It positions itself as a programming language appreciation course, and you spend a lot of time modelling the semantics of programming languages and learning what some common programming buzzwords (polymorphism, type safety, etc.) actually mean in a formal manner. It is initially quite mathematical as the preliminary tools for doing the aforementioned have to be introduced, but if you can make it through that then the reward is well worth it. The overarching theme of the course is definitely on the functional side, however given that the paradigm has been responsible for so many features enjoyed by mainstream languages, its an understandable bias. That being said its not all functional - you of course look at some imperative programming, crack plenty of jokes at OOP/Javas expense, and at the very end even do a bit of concurrency appreciation (which gives you a bit of a taste of
COMP3151).
The programming assignments provide you the opportunity to implement parts of a simple functional programming language in Haskell. Although they claim you dont need to know FP/Haskell already, not knowing it makes your life harder - for someone with only imperative language experience under your belt, writing Haskell code will probably feel weird and takes some time to get used to.
This is an essential course if youre interested in programming language theory, and especially if youre planning to do a thesis in most areas within formal methods. Even if not, its made me consider doing some courses in the future that I originally hadnt planned to, so Id still recommend it highly if you're looking for something to do.