Defmacro.org has an excellent little article on using Haskell to build a working Lisp interpreter--at least a good start at one. I do something similar with my 330 class using Gofer (an outdated dialect related to Haskell). I mostly use Gofer to show them how type inference works, but since they're studying interpreters, they might as well see an inerpreter in Gofer while we're at it.
It's been too long since I've known monads well enough to decipher what he does at the end. I'm going to have to go back and review and then look at his article again--if you don't understand monads before, I doubt you'll get why they're so powerful.