diff options
Diffstat (limited to 'presentations/servant-2016/slides.tex')
-rw-r--r-- | presentations/servant-2016/slides.tex | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/presentations/servant-2016/slides.tex b/presentations/servant-2016/slides.tex deleted file mode 100644 index d5947eb9421a..000000000000 --- a/presentations/servant-2016/slides.tex +++ /dev/null @@ -1,137 +0,0 @@ -\documentclass[12pt]{beamer} -\usetheme{metropolis} -\usepackage{minted} - -\newenvironment{code}{\ttfamily}{\par} - -\title{servant} -\subtitle{Defining web APIs at the type-level} - -\begin{document} -\metroset{titleformat frame=smallcaps} -\setminted{fontsize=\scriptsize} - - -\maketitle - -\section{Introduction} - -\begin{frame}{Type-level DSLs?} - \begin{itemize} - \item (Uninhabited) types with attached ``meaning'' - \item The Expression Problem (Wadler 1998) - \item API representation and interpretation are separated - \item APIs become first-class citizens - \end{itemize} -\end{frame} - -\begin{frame}{Haskell extensions} - \begin{itemize} - \item TypeOperators - \item DataKinds - \item TypeFamilies - \end{itemize} -\end{frame} - -\begin{frame}[fragile]{A servant example} - \begin{minted}{haskell} - type PubAPI = "pubs" :> Get ’[JSON] [Pub] - :<|> "pubs" :> "tagged" - :> Capture "tag" Text - :> Get ’[JSON] [Pub] - \end{minted} -\end{frame} - -\begin{frame}[fragile]{Computed types} - \begin{minted}{haskell} - type TaggedPubs = "tagged" :> Capture "tag" Text :> ... - - taggedPubsHandler :: Server TaggedPubs - taggedPubsHandler tag = ... - \end{minted} -\end{frame} - -\begin{frame}[fragile]{Computed types} - \begin{minted}{haskell} - type TaggedPubs = "tagged" :> Capture "tag" Text :> ... - - taggedPubsHandler :: Server TaggedPubs - taggedPubsHandler tag = ... - - Server TaggedPubs ~ - Text -> EitherT ServantErr IO [Pub] - \end{minted} -\end{frame} - -\section{Interpretations} - -\begin{frame}{servant-server} - The one everyone is interested in! - - \begin{itemize} - \item Based on WAI, can run on warp - \item Interprets combinators with a simple \texttt{HasServer c} class - \item Easy to use! - \end{itemize} -\end{frame} - -\begin{frame}[fragile]{HasServer ...} - \begin{minted}{haskell} - instance (KnownSymbol path, HasServer sublayout) - => HasServer (path :> sublayout) where - type ServerT (path :> sublayout) m = ServerT sublayout m - - route ... - where - pathString = symbolVal (Proxy :: Proxy path) - \end{minted} -\end{frame} - -\begin{frame}[fragile]{Server example} - \begin{minted}{haskell} - type Echo = Capture "echo" Text :> Get ’[PlainText] Text - - echoAPI :: Proxy Echo - echoAPI = Proxy - - echoServer :: Server Echo - echoServer = return - \end{minted} -\end{frame} - -\begin{frame}{servant-client} - \begin{itemize} - \item Generates Haskell client functions for API - \item Same types as API specification: For RPC the whole ``web layer'' is abstracted away - \item Also easy to use! - \end{itemize} -\end{frame} - -\begin{frame}{servant-docs, servant-js ...} - Many other interpretations exist already, for example: - \begin{itemize} - \item Documentation generation - \item Foreign function export (e.g. Elm, JavaScript) - \item Mock-server generation - \end{itemize} -\end{frame} - -\section{Demo} - -\section{Conclusion} - -\begin{frame}{Drawbacks} - \begin{itemize} - \item Haskell has no custom open kinds (yet) - \item Proxies are ugly - \item Errors can be a bit daunting - \end{itemize} -\end{frame} - -\begin{frame}{Questions?} - Ølkartet: github.com/tazjin/pubkartet \\ - Slides: github.com/tazjin/servant-presentation - - @tazjin -\end{frame} -\end{document} |