Expressions in the \gls{mTask}-\gls{EDSL} are divided into two types, namely
boolean expressions and arithmetic expressions. The class of arithmetic
language constructs also contains the function \CI{lit} that lifts a
host-language value into the \gls{EDSL} domain. All standard arithmetic
functions are included in the \gls{EDSL} but are omitted in the example for
brevity. Moreover, the class restrictions are only shown in the first functions
and are omitted in subsequent functions. Both the boolean expression and
arithmetic expression classes are shown in Listing~\ref{lst:arithbool}.

\begin{lstlisting}[language=Clean,label={lst:arithbool},
	caption={Basic classes for expressions}]
class arith v where
  lit           :: t -> v t Expr
  (+.) infixl 6 :: (v t p) (v t q) -> v t Expr          | +, zero t    & isExpr p & isExpr q
  (-.) infixl 6 :: (v t p) (v t q) -> v t Expr          | -, zero t    & ...
  ...
class boolExpr v where
  Not           :: (v Bool p) -> v Bool Expr            | ...
  (&.) infixr 3 :: (v Bool p) (v Bool q) -> v Bool Expr | ...
  ...
  (==.) infix 4 :: (v a p) (v a q) -> v Bool Expr       | ==, toCode a & ...
\end{lstlisting}
