We give a high-level operational semantics for the essential core of the Curry language, including higher-order functions, call-by-need evaluation, non-determinism, narrowing, and residuation. The semantics is structured in monadic style, and is presented in the form of an executable interpreter written in Haskell.