Bläddra i källkod

Improve configuration modularity, use minted for inline code

stripped-german
Julian Ospald 9 år sedan
förälder
incheckning
22f0fd9447
Ingen känd nyckel hittad för denna signaturen i databasen GPG-nyckel ID: 220CD1C5BDEED020
29 ändrade filer med 86 tillägg och 98 borttagningar
  1. +1
    -1
      VL1/content/VL1_ADT1.tex
  2. +1
    -1
      VL1/content/VL1_ADT2.tex
  3. +1
    -1
      VL1/content/VL1_ADT3.tex
  4. +1
    -1
      VL1/content/VL1_ADT4.tex
  5. +8
    -8
      VL1/content/VL1_ADT5.tex
  6. +1
    -1
      VL1/content/VL1_functions_and_control_structures3.tex
  7. +2
    -2
      VL1/content/VL1_lists1.tex
  8. +1
    -1
      VL1/content/VL1_lists3.tex
  9. +1
    -1
      VL1/content/VL1_lists4.tex
  10. +1
    -1
      VL1/content/VL1_pairs.tex
  11. +1
    -1
      VL1/content/VL1_what_does_pure_mean.tex
  12. +2
    -2
      VL2/content/VL2_composition2.tex
  13. +1
    -1
      VL2/content/VL2_currying5.tex
  14. +2
    -4
      VL2/content/VL2_currying6.tex
  15. +3
    -3
      VL2/content/VL2_fold2.tex
  16. +1
    -1
      VL2/content/VL2_fold3.tex
  17. +3
    -6
      VL2/content/VL2_fold4.tex
  18. +1
    -1
      VL2/content/VL2_let.tex
  19. +3
    -3
      VL2/content/VL2_let_vs_where.tex
  20. +2
    -2
      VL2/content/VL2_map1.tex
  21. +1
    -1
      VL2/content/VL2_map3.tex
  22. +1
    -1
      VL2/content/VL2_map4.tex
  23. +3
    -3
      VL2/content/VL2_more_ways_to_define_functions.tex
  24. +1
    -1
      VL2/content/VL2_polymorphism2.tex
  25. +3
    -3
      VL2/content/VL2_questions_for_you.tex
  26. +1
    -1
      VL2/content/VL2_where.tex
  27. +3
    -12
      common/article_configuration.tex
  28. +4
    -34
      common/beamer_configuration.tex
  29. +32
    -0
      common/common_configuration.tex

+ 1
- 1
VL1/content/VL1_ADT1.tex Visa fil

@@ -8,7 +8,7 @@ data WeekDay = Monday
| Saturday
| Sunday
\end{haskellcode}
This declares the new data type \code{WeekDay} with 7 \emph{constructors}. That means \code{Monday}, \code{Tuesday} etc. are all values of the type \code{WeekDay}.
This declares the new data type \hinline{WeekDay} with 7 \emph{constructors}. That means \hinline{Monday}, \hinline{Tuesday} etc. are all values of the type \hinline{WeekDay}.
\pause
\\
We could now define a whole week, by creating a list:


+ 1
- 1
VL1/content/VL1_ADT2.tex Visa fil

@@ -1,4 +1,4 @@
And we can again \emph{pattern match} on our \code{WeekDay} type. Let's find out if a given day is a Monday:
And we can again \emph{pattern match} on our \hinline{WeekDay} type. Let's find out if a given day is a Monday:
\pause
\begin{haskellcode}
isMonday :: WeekDay -> Bool


+ 1
- 1
VL1/content/VL1_ADT3.tex Visa fil

@@ -1,4 +1,4 @@
But we can do more than enumerations. How about we do some error handling? Let's say we want a function to return an \code{Int}, but in case something went horribly wrong, we don't just want to return a 0 or some magic number, but a proper error message. Here we go:
But we can do more than enumerations. How about we do some error handling? Let's say we want a function to return an \hinline{Int}, but in case something went horribly wrong, we don't just want to return a 0 or some magic number, but a proper error message. Here we go:
\pause
\begin{haskellcode}
data MaybeInt = NoError Int


+ 1
- 1
VL1/content/VL1_ADT4.tex Visa fil

@@ -12,4 +12,4 @@ addIntToList :: MaybeInt -> [Int]
addIntToList (NoError x) = [x]
addIntToList (Error str) = []
\end{haskellcode}
So if we got an error, we just return an empty list, otherwise we return a list with the \code{Int} as its only element.
So if we got an error, we just return an empty list, otherwise we return a list with the \hinline{Int} as its only element.

+ 8
- 8
VL1/content/VL1_ADT5.tex Visa fil

@@ -8,16 +8,16 @@ Uh... that looks mean. Let's examine this.\\
\pause
We have:
\begin{itemizep}
\item defined a data type \code{Tree}
\item a constructor \code{Leaf} of type \code{Tree} with one arguments of type \code{Char}
\item a constructor \code{Node} of type \code{Tree} with 3 arguments
\item defined a data type \hinline{Tree}
\item a constructor \hinline{Leaf} of type \hinline{Tree} with one arguments of type \hinline{Char}
\item a constructor \hinline{Node} of type \hinline{Tree} with 3 arguments
\begin{itemizep}
\item \code{Tree}
\item \code{Int}
\item \code{Tree}
\item \hinline{Tree}
\item \hinline{Int}
\item \hinline{Tree}
\end{itemizep}
\end{itemizep}
\slidep
That means: a \code{Tree} can either be a \code{Leaf} or an internal \code{Node} with two sub-trees. If we want to create a \code{Leaf}, we have to pass the constructor a \code{Char}. If we want to create a \code{Node}, we have to pass 3 arguments, in order: another \code{Tree}, an \code{Int} and yet another \code{Tree}.\\
So we can save information in the leafs (\code{Char}) and in the internal nodes (\code{Int}).\\
That means: a \hinline{Tree} can either be a \hinline{Leaf} or an internal \hinline{Node} with two sub-trees. If we want to create a \hinline{Leaf}, we have to pass the constructor a \hinline{Char}. If we want to create a \hinline{Node}, we have to pass 3 arguments, in order: another \hinline{Tree}, an \hinline{Int} and yet another \hinline{Tree}.\\
So we can save information in the leafs (\hinline{Char}) and in the internal nodes (\hinline{Int}).\\
This is just an example. There are endless more ways of trees.

+ 1
- 1
VL1/content/VL1_functions_and_control_structures3.tex Visa fil

@@ -7,4 +7,4 @@ mod2 x
| x - 2 < 0 = x
| otherwise = mod2 (x - 2)
\end{haskellcode}
These \verb#|# things above are called \textbf{guards} and are similar to \emph{pattern matching}. They are processed in order. If the condition on the left side of the equation is true, then it returns what stands on the right side of the equation. If it's false, then it processes the next line.\\ \code{otherwise} on the last line is just defined as \code{True}, to make these constructs easier to read and catch all other cases of input.
These \verb#|# things above are called \textbf{guards} and are similar to \emph{pattern matching}. They are processed in order. If the condition on the left side of the equation is true, then it returns what stands on the right side of the equation. If it's false, then it processes the next line.\\ \hinline{otherwise} on the last line is just defined as \hinline{True}, to make these constructs easier to read and catch all other cases of input.

+ 2
- 2
VL1/content/VL1_lists1.tex Visa fil

@@ -1,12 +1,12 @@
The list is probably the most basic data structure in Haskell. Like the array in C. It is a singly-linked list and is very lazy. The compiler has numerous ways to optimize lists, so don't be afraid to use them, even for huge things.
\pause
We build lists by using either the \code{[]} notation:
We build lists by using either the \hinline{[]} notation:
\begin{haskellcode}
list1 :: [Integer]
list1 = [1, 2]
\end{haskellcode}
\pause
or by using the \emph{cons} operator \code{(:)} which takes an element and a list and produces a new list with the element prepended to the front.
or by using the \emph{cons} operator \hinline{(:)} which takes an element and a list and produces a new list with the element prepended to the front.
\begin{haskellcode}
emptyList = []



+ 1
- 1
VL1/content/VL1_lists3.tex Visa fil

@@ -12,4 +12,4 @@ sumEveryTwo [] = 0
sumEveryTwo (x:[]) = [x]
sumEveryTwo (x:(y:zs)) = (x + y) : sumEveryTwo zs
\end{haskellcode}
Note that \code{(x:(y:zs))} may also be written as \code{(x:y:zs)}.
Note that \hinline{(x:(y:zs))} may also be written as \hinline{(x:y:zs)}.

+ 1
- 1
VL1/content/VL1_lists4.tex Visa fil

@@ -16,4 +16,4 @@ Now let's say we want all numbers between 50 and 100 that have the remainder 0 w
\begin{haskellcode*}{bgcolor=mygrey,frame=single,numbers=none,label=GHCi}
> [x | x <- [50..100], mod x 12 == 0]
\end{haskellcode*}
\code{x <- [50..100]} is the binding, while \code{mod x 12 == 0} is the predicate, separated by a comma. We can have multiple predicates.
\hinline{x <- [50..100]} is the binding, while \hinline{mod x 12 == 0} is the predicate, separated by a comma. We can have multiple predicates.

+ 1
- 1
VL1/content/VL1_pairs.tex Visa fil

@@ -8,4 +8,4 @@ sumPair :: (Int, Int) -> Int
sumPair (x, y) = x + y
\end{haskellcode}
\pause
Note: we use \code{(x, y)} notation for both the type and the definition! Those are still two different things. We can also have triples, quadruples etc.
Note: we use \hinline{(x, y)} notation for both the type and the definition! Those are still two different things. We can also have triples, quadruples etc.

+ 1
- 1
VL1/content/VL1_what_does_pure_mean.tex Visa fil

@@ -4,7 +4,7 @@
\item everything (variables, data structures...) is \emph{immutable}
\item expressions never have side-effects (remember: mathematical functions)
\item same input $\mapsto$ same output... \emph{always}!
\item replace a function with it's (return) value? Yes. What happens in C or java if you do that? Remember \code{void pop();}?
\item replace a function with it's (return) value? Yes. What happens in C or java if you do that? Remember \cppinline{void pop();}?
\end{itemizep}
\slidep
\vspace{\baselineskip}


+ 2
- 2
VL2/content/VL2_composition2.tex Visa fil

@@ -1,8 +1,8 @@
But let's not stop here. What does the dot \code{(.)} actually mean?
But let's not stop here. What does the dot \hinline{(.)} actually mean?
\vspace{\baselineskip}
\\
\pause
It's just a function (the \emph{prefix} version of \code{.})! Here is the type signature:
It's just a function (the \emph{prefix} version of \hinline{.})! Here is the type signature:
\begin{haskellcode}
(.) :: (b -> c) -> (a -> b) -> a -> c
\end{haskellcode}


+ 1
- 1
VL2/content/VL2_currying5.tex Visa fil

@@ -13,4 +13,4 @@ Did you just notice the braces? They are \textbf{very} important! So, currying i
f :: Int -> Int -> Int
f :: Int -> (Int -> Int)
\end{haskellcode}
On the other hand function application is \emph{left}-associative, so \code{f 3 2} is just a shorthand of \code{(f 3) 2}. Makes sense?
On the other hand function application is \emph{left}-associative, so \hinline{f 3 2} is just a shorthand of \hinline{(f 3) 2}. Makes sense?

+ 2
- 4
VL2/content/VL2_currying6.tex Visa fil

@@ -7,11 +7,9 @@ addInt x y = x + y
addTwo :: Int -> Int
addTwo = addInt 2
\end{haskellcode}
You probably noticed that we did not write \code{addTwo x = ...}, but why would we? We gave \code{addInt} one argument, so the arity (we called it dimension in the gemoetrical example) is one less, but there is still one parameter left we can pass in.
\vspace{\baselineskip}
\\
You probably noticed that we did not write \hinline{addTwo x = ...}, but why would we? We gave \hinline{addInt} one argument, so the arity (we called it dimension in the gemoetrical example) is one less, but there is still one parameter left we can pass in.
\pause
The reason we can omit the \code{x} here is that
The reason we can omit the \hinline{x} here is that
\begin{haskellcode}
f x y z = ...
\end{haskellcode}


+ 3
- 3
VL2/content/VL2_fold2.tex Visa fil

@@ -7,13 +7,13 @@ fold z f (x:xs) = x `f` (fold z f xs)
Whoa! What's going on here?\\
Let's see...
\begin{itemizep}
\item \code{z} is what we return if the list is empty
\item \code{f} is our function (e.g. \code{(*)} or \code{(+)})
\item \hinline{z} is what we return if the list is empty
\item \hinline{f} is our function (e.g. \hinline{(*)} or \hinline{(+)})
\item and the last remaining argument is the actual list we are working on
\end{itemizep}
\slidep
The function application has the following form:\\
\code{fold f z [a,b,c] == a `f` (b `f` (c `f` z))}
\hinline{fold f z [a,b,c] == a `f` (b `f` (c `f` z))}
\vspace{\baselineskip}
\\
This folds from the right, so the \emph{Prelude} already defines a function which is very similar to ours and called \textbf{foldr}.

+ 1
- 1
VL2/content/VL2_fold3.tex Visa fil

@@ -1,4 +1,4 @@
So how do our \code{sum}, \code{prod} and \code{length} functions look like if we use our \code{fold} abstraction?
So how do our \hinline{sum}, \hinline{prod} and \hinline{length} functions look like if we use our \hinline{fold} abstraction?
\pause
\begin{haskellcode}
sum :: [Int] -> Int


+ 3
- 6
VL2/content/VL2_fold4.tex Visa fil

@@ -4,7 +4,7 @@ To summarize:
foldr f z [a,b,c] == a `f` (b `f` (c `f` z))
foldl f z [a,b,c] == ((z `f` a) `f` b) `f` c
\end{haskellcode}
For \code{foldl} the \code{z} is sort of the starting value.
For \hinline{foldl} the \hinline{z} is sort of the starting value.
\vspace{\baselineskip}
\\
\pause
@@ -12,10 +12,7 @@ We can even express foldl in terms of foldr and vice versa. If you are intereste
\vspace{\baselineskip}
\\
You should definitely look them up in the Prelude and play with them: \url{https://hackage.haskell.org/package/base-4.8.0.0/docs/Prelude.html}
\vspace{\baselineskip}
\\
GHCi...
\begin{haskellcode}
\begin{haskellcode*}{bgcolor=mygrey,frame=single,numbers=none,label=GHCi}
> foldr (-) 0 [1, 2, 3]
> foldl (-) 0 [1, 2, 3]
\end{haskellcode}
\end{haskellcode*}

+ 1
- 1
VL2/content/VL2_let.tex Visa fil

@@ -1,4 +1,4 @@
Another way which is very similar would be using \code{let}:
Another way which is very similar would be using \hinline{let}:
\begin{haskellcode}
f :: Int -> Int
f x = let y p = x + p


+ 3
- 3
VL2/content/VL2_let_vs_where.tex Visa fil

@@ -1,4 +1,4 @@
These look almost the same, but they are different constructs. \code{where} is bound to the pattern matching \code{f x =} and may also have access to parts of a function that are not syntactically expressions, e.g.:
These look almost the same, but they are different constructs. \hinline{where} is bound to the pattern matching \hinline{f x =} and may also have access to parts of a function that are not syntactically expressions, e.g.:
\begin{haskellcode}
f x
| cond1 x = a
@@ -7,11 +7,11 @@ f x
where
a = w x
\end{haskellcode}
While that is not possible with \code{let}, which is an actual expression and can be used whenever expressions are allowed (e.g. inside \emph{Monads}, we'll know more about these in a few weeks).
While that is not possible with \hinline{let}, which is an actual expression and can be used whenever expressions are allowed (e.g. inside \emph{Monads}, we'll know more about these in a few weeks).
\vspace{\baselineskip}
\\
There are a few more intricacies, but most of the time this is just style consideration:\\ \url{https://wiki.haskell.org/Let_vs._Where}
\pause
\vspace{\baselineskip}
\\
How would we have to rewrite the function in order to use \code{let}?
How would we have to rewrite the function in order to use \hinline{let}?

+ 2
- 2
VL2/content/VL2_map1.tex Visa fil

@@ -1,7 +1,7 @@
Let's say we have a list of \code{Int} and want to add \code{2} to every element of the list.
Let's say we have a list of \hinline{Int} and want to add \hinline{2} to every element of the list.
\begin{haskellcode}
addTwo :: [Int] -> [Int]
addTwo ... ?
\end{haskellcode}
\pause
\textbf{Exercise:} Find the answer! 5 minutes time, remember the \emph{cons} operator \code{(:)}, pattern matching on lists and ofc recursion! Start with the case of an empty list.
\textbf{Exercise:} Find the answer! 5 minutes time, remember the \emph{cons} operator \hinline{(:)}, pattern matching on lists and ofc recursion! Start with the case of an empty list.

+ 1
- 1
VL2/content/VL2_map3.tex Visa fil

@@ -13,4 +13,4 @@ map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
\end{haskellcode}
So we don't really know what the function \code{f} does, but we know that it converts one element of the list to something else. We \emph{map} a function over a list! Hence the name.
So we don't really know what the function \hinline{f} does, but we know that it converts one element of the list to something else. We \emph{map} a function over a list! Hence the name.

+ 1
- 1
VL2/content/VL2_map4.tex Visa fil

@@ -12,4 +12,4 @@ absList xs = map (\x -> abs x) xs
absList = map abs
\end{haskellcode}
\pause
Cool, right? So now we have abstracted out the \textbf{recursion pattern} that is all the same for those 3 functions. \code{map} is actually part of the standard library (called \emph{Prelude}).
Cool, right? So now we have abstracted out the \textbf{recursion pattern} that is all the same for those 3 functions. \hinline{map} is actually part of the standard library (called \emph{Prelude}).

+ 3
- 3
VL2/content/VL2_more_ways_to_define_functions.tex Visa fil

@@ -3,14 +3,14 @@ Now you know how a regular function looks like, e.g:
f :: Int -> Int
f x = x + 1
\end{haskellcode}
But now imagine we need a helper function which is very specific to the current function. In C we would have to define this new helper function at top-level and would probably make it \code{static}.
But now imagine we need a helper function which is very specific to the current function. In C we would have to define this new helper function at top-level and would probably make it \cinline{static}.
\pause
\vspace{\baselineskip}
\\
Haskell allows us to \textbf{inline} functions in a few more ways, e.g.:
\begin{itemizep}
\item with \code{where}
\item with \code{let...in}
\item with \hinline{where}
\item with \hinline{let...in}
\item anonymously (lambda abstraction)
\end{itemizep}
\slidep

+ 1
- 1
VL2/content/VL2_polymorphism2.tex Visa fil

@@ -13,7 +13,7 @@ Whatever the function does... it has something of one type and returns something
\vspace{\baselineskip}
\\
\pause
Similarly, remember the function \code{head} which gives us the first element of a list? The type signature actually looks like this:
Similarly, remember the function \hinline{head} which gives us the first element of a list? The type signature actually looks like this:
\begin{haskellcode}
head :: [a] -> a
\end{haskellcode}

+ 3
- 3
VL2/content/VL2_questions_for_you.tex Visa fil

@@ -1,9 +1,9 @@
\begin{itemize}
\item what is the difference between \code{let} and \code{where}?
\item what is the difference between \code{foldr} and \code{foldl}?
\item what is the difference between \hinline{let} and \hinline{where}?
\item what is the difference between \hinline{foldr} and \hinline{foldl}?
\item what is the difference between explicit and implicit recursion? Give examples
\item how many arguments does a haskell function have (strictly speaking)?
\item what do you have to keep in mind in order to make function composition work?
\item can you define map and filter in terms of foldr?
\item can you define \hinline{map} and \hinline{filter} in terms of \hinline{foldr}?
\item what is eta reduction (or: eta abstraction)?
\end{itemize}

+ 1
- 1
VL2/content/VL2_where.tex Visa fil

@@ -1,4 +1,4 @@
We use \code{where} to define a helper function:
We use \hinline{where} to define a helper function:
\begin{haskellcode}
f :: Int -> Int
f x = x + (y 2)


+ 3
- 12
common/article_configuration.tex Visa fil

@@ -14,15 +14,10 @@
\usepackage[T1]{fontenc}
\usepackage[Q=yes]{examplep}

\input{../common/common_configuration.tex}

% package configuration
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\usemintedstyle{friendly}
\newminted{haskell}{frame=single,numbers=left,samepage=true}
\newminted{cpp}{frame=single,numbers=left}
\newminted{c}{frame=single,numbers=left}
\renewcommand{\theFancyVerbLine}{\ttfamily
\textcolor[rgb]{0.0,0.0,0.0}{\footnotesize
\oldstylenums{\arabic{FancyVerbLine}}}}

% macros and environments
\NewDocumentCommand {\slide} { m O{} O{} }
@@ -33,8 +28,4 @@
\newcommand{\slidep}{}
\newenvironment{itemizep}
{\begin{itemize}}
{\end{itemize}}

% color definition
\definecolor{solarized}{HTML}{002B36}
\definecolor{mygreen}{rgb}{0,0.6,0}
{\end{itemize}}

+ 4
- 34
common/beamer_configuration.tex Visa fil

@@ -6,55 +6,26 @@
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{minted}
\usepackage[newfloat=true]{minted}
\usepackage{xparse}

% for \verb inside \item
\usepackage[T1]{fontenc}
\usepackage[Q=yes]{examplep}

% color definition
\definecolor{solarized}{HTML}{002B36}
\definecolor{mygreen}{HTML}{009900}
\definecolor{mygrey}{rgb}{0.95,0.95,0.95}
\input{../common/common_configuration.tex}

% package configuration
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\beamertemplatenavigationsymbolsempty
\setbeamertemplate{footline}[frame number]

% minted
%% fix the minted@colorbg environment
\makeatletter
\renewenvironment{minted@colorbg}[1]
{\def\minted@bgcol{#1}%
\noindent
\begin{lrbox}{\minted@bgbox}
\begin{minipage}{\linewidth-2\fboxsep}}
{\end{minipage}%
\end{lrbox}%
\setlength{\topsep}{\smallskipamount}% set the vertical space
\trivlist\item\relax % ensure going to a new line
\colorbox{\minted@bgcol}{\usebox{\minted@bgbox}}%
\endtrivlist % close the trivlist
}
\makeatother
\usemintedstyle{friendly}
\newminted{haskell}{bgcolor=mygrey,frame=single,numbers=left}
\newminted{cpp}{bgcolor=mygrey,frame=single,numbers=left}
\newminted{c}{bgcolor=mygrey,frame=single,numbers=left}
\renewcommand{\theFancyVerbLine}{\ttfamily
\textcolor[rgb]{0.0,0.0,0.0}{\footnotesize
\oldstylenums{\arabic{FancyVerbLine}}}}

% macros and environments
\newcommand{\code}[1]{\texttt{#1}}
\newcommand{\slidep}{\onslide<+->}
\newenvironment{itemizep}
{\begin{itemize}[<+->]}
{\end{itemize}}
\NewDocumentCommand {\slide} { m O{} O{} }
{\begin{frame}{#3}
\frametitle{\thesection.\ifnum\thesubsection=0\else\thesubsection.\fi\ \currentname {#2}}
@@ -67,8 +38,7 @@
\tableofcontents[currentsection,hideothersubsections]
\end{frame}}
% sections numbered
% sections numbered
\setbeamertemplate{section in toc}[sections numbered]
\setbeamertemplate{subsection in toc}[subsections numbered]
\defbeamertemplate{subsubsection in toc}{subsubsections numbered}
@@ -81,4 +51,4 @@
\usepackage{nameref}
\makeatletter
\newcommand*{\currentname}{\@currentlabelname}
\makeatother
\makeatother

+ 32
- 0
common/common_configuration.tex Visa fil

@@ -0,0 +1,32 @@
% color definition
\definecolor{solarized}{HTML}{002B36}
\definecolor{mygreen}{HTML}{009900}
\definecolor{myblue}{HTML}{0000FF}
\definecolor{mygrey}{rgb}{0.95,0.95,0.95}

% minted
%% fix the minted@colorbg environment
\makeatletter
\renewenvironment{minted@colorbg}[1]
{\def\minted@bgcol{#1}%
\noindent
\begin{lrbox}{\minted@bgbox}
\begin{minipage}{\linewidth-2\fboxsep}}
{\end{minipage}%
\end{lrbox}%
\setlength{\topsep}{\smallskipamount}% set the vertical space
\trivlist\item\relax % ensure going to a new line
\colorbox{\minted@bgcol}{\usebox{\minted@bgbox}}%
\endtrivlist % close the trivlist
}
\makeatother
\usemintedstyle{friendly}
\newminted{haskell}{bgcolor=mygrey,frame=single,numbers=left}
\newminted{cpp}{bgcolor=mygrey,frame=single,numbers=left}
\newminted{c}{bgcolor=mygrey,frame=single,numbers=left}
\newcommand{\hinline}[1]{\mintinline{haskell}{#1}}
\newcommand{\cinline}[1]{\mintinline{c}{#1}}
\newcommand{\cppinline}[1]{\mintinline{cpp}{#1}}
\renewcommand{\theFancyVerbLine}{\ttfamily
\textcolor[rgb]{0.0,0.0,0.0}{\footnotesize
\oldstylenums{\arabic{FancyVerbLine}}}}

Laddar…
Avbryt
Spara