To my own question, I'll add the 99 Problems for Scheme, Prolog, Ocaml, Haskell, Scala, and various other languages, as mentioned elsewhere on this thread.
They contain a surprising amount of basic computer science in very short questions. Master them and you'll be well on your way to understanding functional (or declarative, in the case of Prolog) programming.
Codewars provides (mostly) bite-sized coding challenges in a wide range of programming languages. Each challenge is ranked by difficulty, and, once completed, you can view other user solutions for learning and comparison (which other similarly-designed sites do not allow).