\section{Conclusion} \label{sec:concl} Walking through the implementation of a While interpreter we have seen different advantages of doing this in a functional style. First of all, the syntax could be translated directly from grammar to type definitions. It is true that simple algebraic data types, as used in \autoref{sec:ast}, could be simulated with enumeration types and pointers in an imperative style. However, any one will agree that the functional definitions are better readable, making their usage less error-prone. Secondly, in \autoref{sec:eval} we saw that functional programming languages allow us to easily work with higher order functions: we did not need to implement the state as a lookup table but could simply use a function. We then discussed the use of the \CI{Either} monad for error reporting. Monadic binding lets us work easily with calculations that may fail. Moreover, in \autoref{sec:interp} we saw that monads also let us specify execution order. In general, we have seen that a functional style allows us to stay close to the semantic definitions of a language. This makes it very easy to verify that our implementation of the semantics is correct. Proofs that hold for the semantics (like completeness or correctness with respect to axiomatic semantics) easily apply to the interpreter as well, once the correctness of the interpreter has been established --- this is generally a trivial task. Furthermore, the final implementation is better readable and thus easier to maintain.