Add slides
This commit is contained in:
commit
009888e1ed
5 changed files with 223 additions and 0 deletions
137
slides.tex
Normal file
137
slides.tex
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
\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}
|
||||
Loading…
Add table
Add a link
Reference in a new issue