Okay, I just edited my code above so it should compile. Note that switched from Oleg's notation to Conal's notation.
I added an `Interpretable` class. If a language implements `Interpretable` it can be evaluated in Haskell. With this class there can be multiple instances of `run` for different semantics. It's clear from reading Conal's paper that not every instance of this language can be `Interpretable`. If you want to evaluate a term given some semantics you'll need to specialize `interpret` using the clumsy way I've demonstrated.