\begin{slide}{Mehrfach-Abstraktion/Applikation}

bereits im Lambda-Kalkül vereinbart:

\[ ((\lambda x y . M) A B) 
\equiv (((\lambda x.(\lambda y.M))A)B)
\]
bisher: konkret: \verb|(lam x b), (app f a)|, abstrakt:
\begin{verbatim}
| Abstraction { formal :: S.Id , body :: Exp }
| Application { rator :: Exp, rand :: Exp }
\end{verbatim} 
neu: konkret: \verb|(abs (x y) b), (f a b c)|, abstrakt:
\begin{verbatim}
| MultiAbstraction 
    { mformal :: [ S.Id ] , body :: Exp }
| MultiApplication 
    { rator :: Exp, mrand :: [ Exp ] }
\end{verbatim}

\end{slide}

\begin{slide}{Mehrfach-Abstraktion/Applikation}

Desugaring durch Ersetzungsregeln:

\begin{verbatim}
(abs []     b) -> b
(abs (x:xs) b) -> (lam x (abs xs b))

(f []    ) -> f
(f (x:xs)) -> ((app f x) xs) 
\end{verbatim}

\bigskip

nützliche Abkürzung für primitive Operationen:
\begin{verbatim}
(prim + 3 4) -> (@+ 3 4)
\end{verbatim}

\end{slide}
