wsheets/wsh02.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Fri, 26 Apr 2024 17:37:56 +0100
changeset 485 02d2d49c9feb
parent 444 e6df3c7ff132
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
197
Christian Urban <urbanc@in.tum.de>
parents: 195
diff changeset
     1
% !TEX program = xelatex
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     2
\documentclass{article}
423
554278cd4b70 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 400
diff changeset
     3
\usepackage{../styles/style}
554278cd4b70 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 400
diff changeset
     4
\usepackage{../styles/langs}
272
a091de62e3f8 updated
Christian Urban <urbanc@in.tum.de>
parents: 271
diff changeset
     5
\usepackage{tikz}
a091de62e3f8 updated
Christian Urban <urbanc@in.tum.de>
parents: 271
diff changeset
     6
\usepackage{pgf}
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     7
\usepackage{marvosym}
184
19b1e01054f6 updated
pdated
parents: 183
diff changeset
     8
\usepackage{boxedminipage}
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     9
352
644aca68e203 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 343
diff changeset
    10
\lstset{escapeinside={/*!}{!*/}}
644aca68e203 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 343
diff changeset
    11
\newcommand{\annotation}[1]{\hfill\footnotesize{}#1}
272
a091de62e3f8 updated
Christian Urban <urbanc@in.tum.de>
parents: 271
diff changeset
    12
352
644aca68e203 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 343
diff changeset
    13
\usepackage{menukeys}
335
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    14
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    15
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    16
% Exact colors from NB
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    17
\usepackage[breakable]{tcolorbox}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    18
\definecolor{incolor}{HTML}{303F9F}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    19
\definecolor{outcolor}{HTML}{D84315}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    20
\definecolor{cellborder}{HTML}{CFCFCF}
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    21
\definecolor{cellbackground}{HTML}{F7F7F7}
334
305e1dcdb3bc updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 333
diff changeset
    22
335
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    23
9476aee44eed updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 334
diff changeset
    24
    
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    25
\begin{document}
439
e27ff222fef3 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 438
diff changeset
    26
\fnote{\copyright{} Christian Urban, King's College London, 2022}
195
4bacbe753e66 updated
Christian Urban <urbanc@in.tum.de>
parents: 193
diff changeset
    27
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    28
\section*{Scala Worksheet 2}
271
5c7279e09b15 updated
Christian Urban <urbanc@in.tum.de>
parents: 270
diff changeset
    29
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    30
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    31
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    32
\subsection*{Task 1 (Options)}
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    33
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    34
Get familiar with the return value of functions that can
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    35
``go wrong'':
301
aa0e86419773 updated
Christian Urban <urbanc@in.tum.de>
parents: 278
diff changeset
    36
aa0e86419773 updated
Christian Urban <urbanc@in.tum.de>
parents: 278
diff changeset
    37
\begin{lstlisting}[numbers=none]
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    38
scala> List(7,2,3,4,5,6).find(_ < 4)
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    39
scala> List(5,6,7,8,9).find(_ < 4)
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    40
scala> List(5,6,7,8,9).min
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    41
scala> List(5,6,7,8,9).minOption
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    42
scala> List[Int]().minOption
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    43
\end{lstlisting}
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    44
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    45
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    46
Note that there needs to be a type-annotation for \texttt{List()} otherwise
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    47
Scala will not know which \texttt{min}-version it should use. 
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    48
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    49
\subsection*{Task 2 (Try)}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    50
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    51
The Scala-Idiom \texttt{Try-getOrElse} allows you to conveniently
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    52
deal with failure cases.
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    53
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    54
\begin{lstlisting}[numbers=none]
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    55
scala> Try(Some(List(5,6,7,8,9).min)).getOrElse(None)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    56
scala> Try(Some(List[Int]().min)).getOrElse(None)
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
    57
\end{lstlisting}
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    58
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    59
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    60
Note that \texttt{Try} needs the library \texttt{scala.util.\_} to be
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    61
imported. 
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    62
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
    63
439
e27ff222fef3 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 438
diff changeset
    64
\begin{lstlisting}[numbers=none]
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    65
def safe_div(x: Int, y: Int) : Option[Int] = 
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    66
  Try(Some(x / y)).getOrElse(None)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    67
\end{lstlisting}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    68
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    69
\subsection*{Task 3 (URLs / Files)}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    70
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    71
For simple tasks such as reading webpages and files, Scala provides
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    72
convenient functions \texttt{Source.fromURL} and \texttt{Source.fromFile}.
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    73
To try them out, you need to import \texttt{io.Source}.
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    74
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    75
\begin{lstlisting}[numbers=none]
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    76
scala> Source.fromURL(my_url)("ISO-8859-1").mkString
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    77
scala> Source.fromFile(my_file)("ISO-8859-1").mkString
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    78
\end{lstlisting}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    79
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    80
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    81
These functions return an iterator, which can be transformed into a String
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    82
using \texttt{mkString}. The second argument fixes the character encoding
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    83
and should not be omitted. If you are interested in the individual lines
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    84
in the file, for example, you can use
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    85
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    86
\begin{lstlisting}[numbers=none]
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    87
Source.fromFile(my_file)("ISO-8859-1")
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    88
                            .getLines().toList
343
51e25cc30483 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 335
diff changeset
    89
\end{lstlisting}
51e25cc30483 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 335
diff changeset
    90
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    91
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    92
If you are after proper error-handling, then you can use Scala's options
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    93
as follows
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    94
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    95
\begin{lstlisting}[numbers=none]
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    96
Try(Some(Source.fromFile("test.txt")("ISO-8859-1")
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    97
                          .mkString)).getOrElse(None)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    98
\end{lstlisting}  
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
    99
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   100
This can also be written slightly shorter as
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   101
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   102
\begin{lstlisting}[numbers=none]
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   103
Try(Source.fromFile("test.txt")("ISO-8859-1")
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   104
                          .mkString).toOption
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   105
\end{lstlisting}  
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   106
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   107
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   108
In case of reading files, there can be an issue with closing
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   109
files properly. For this Scala provides \texttt{Using}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   110
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   111
\begin{lstlisting}[numbers=none]
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   112
  Using(Source.fromFile("test.txt")("ISO-8859-1"))
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   113
                                 (_.mkString).toOption
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   114
\end{lstlisting}  
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   115
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   116
\noindent
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   117
This closes the files automatically after reading, but otherwise
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   118
behaves as the code shown above: It gives a \texttt{Some} in the
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   119
success case and \texttt{None} in the failure case. However,
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   120
\texttt{Using} requires a function as argument for prescribing
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   121
of what to do with the file content in the success case.
442
94117c4f8b67 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 441
diff changeset
   122
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   123
\subsection*{Task 4 (Higher-Order Functions)}
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   124
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   125
Higher-Order functions means that Scala allows functions to
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   126
have functions as arguments and also allows functions to
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   127
return functions. Get familiar with the short-hand notation
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   128
for simple functions
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   129
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   130
\begin{lstlisting}[numbers=none]
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   131
scala> List(7,2,3,4,5,6).find(_ < 4)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   132
scala> List(7,2,3,4,5,6).count(_ % 2 == 0)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   133
scala> List(7,2,3,4,5,6).sortWith(_ > _)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   134
scala> List(7,2,3,4,5,6).filter(_ > 4)
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   135
\end{lstlisting}
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   136
444
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   137
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   138
Be aware that this short-hand notation only works for ``smallish'' functions
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   139
and that sometimes Scala cannot figure out the types involved without
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   140
explicit type annotations.
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   141
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   142
\subsection*{Task 5 (Maps)}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   143
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   144
Get familiar with the map-function for lists, sets etc. It is the
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   145
quintessential higher-order function and frequently used for transforming
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   146
lists.
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   147
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   148
\begin{lstlisting}[numbers=none]
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   149
scala> List(7,2,3,4,5,6).map(n => n * n)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   150
\end{lstlisting}  
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   151
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   152
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   153
Make also sure you see that Scala's \texttt{for}-comprehensions
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   154
are just syntactic sugar for \texttt{map}s. What would this
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   155
expression look like as \texttt{for}-comprehension? What are
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   156
the advantages of \texttt{for}-comprehensions over \texttt{map}s.
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   157
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   158
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   159
\subsection*{Task 6 (Pattern-Matching)}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   160
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   161
Rewrite the following function using pattern-matching
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   162
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   163
\begin{lstlisting}[numbers=none]
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   164
def my_map(lst: List[Int], f: Int => Int) : List[Int] = {
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   165
 if (lst == Nil) Nil
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   166
 else f(lst.head) :: my_map(lst.tail, f)
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   167
}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   168
\end{lstlisting}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   169
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   170
\noindent
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   171
Observe that the type of the function is from \texttt{Int}s to
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   172
\texttt{Int}s, which is written in Scala as type \texttt{Int => Int}.
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   173
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   174
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   175
\subsection*{Task 7 (Web-Crawler, Hard)}
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   176
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   177
Have a look at the web-crawler at the end of \texttt{lecture2.scala}.
e6df3c7ff132 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 442
diff changeset
   178
Can you modify it such that every page is only visited once? 
441
5266495f4aad updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 439
diff changeset
   179
123
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   180
\end{document}
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   181
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   182
%%% Local Variables: 
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   183
%%% mode: latex
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   184
%%% TeX-master: t
006f71e905a1 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   185
%%% End: