197
|
1 |
% !TEX program = xelatex
|
123
|
2 |
\documentclass{article}
|
426
|
3 |
\usepackage{../styles/style}
|
|
4 |
\usepackage{../styles/langs}
|
272
|
5 |
\usepackage{tikz}
|
|
6 |
\usepackage{pgf}
|
123
|
7 |
\usepackage{marvosym}
|
184
|
8 |
\usepackage{boxedminipage}
|
123
|
9 |
|
352
|
10 |
\lstset{escapeinside={/*!}{!*/}}
|
|
11 |
\newcommand{\annotation}[1]{\hfill\footnotesize{}#1}
|
272
|
12 |
|
352
|
13 |
\usepackage{menukeys}
|
335
|
14 |
|
|
15 |
|
|
16 |
% Exact colors from NB
|
|
17 |
\usepackage[breakable]{tcolorbox}
|
|
18 |
\definecolor{incolor}{HTML}{303F9F}
|
|
19 |
\definecolor{outcolor}{HTML}{D84315}
|
|
20 |
\definecolor{cellborder}{HTML}{CFCFCF}
|
|
21 |
\definecolor{cellbackground}{HTML}{F7F7F7}
|
334
|
22 |
|
335
|
23 |
|
|
24 |
|
123
|
25 |
\begin{document}
|
442
|
26 |
\fnote{\copyright{} Christian Urban, King's College London, 2022}
|
195
|
27 |
|
442
|
28 |
\section*{Scala Worksheet 1}
|
188
|
29 |
|
442
|
30 |
Please install Scala on your work-machine: You should have
|
444
|
31 |
Scala up and running after this week, and also have an IDE that allows you to
|
|
32 |
access the Scala REPL. Some installation instructions are given at
|
170
|
33 |
|
442
|
34 |
\begin{center}
|
|
35 |
\url{https://www.scala-lang.org/download/2.13.10.html}
|
|
36 |
\end{center}
|
395
|
37 |
|
442
|
38 |
\subsubsection*{MacOSX}
|
195
|
39 |
|
442
|
40 |
\begin{itemize}
|
|
41 |
\item[0)] (if needed) \texttt{brew install java} \;\;or\;\; \texttt{brew reinstall java}
|
|
42 |
\item[1)] \texttt{brew install scala@2.13}
|
|
43 |
\end{itemize}
|
181
|
44 |
|
442
|
45 |
\noindent Another method to install Scala on MacOSX
|
181
|
46 |
|
442
|
47 |
\begin{itemize}
|
|
48 |
\item[1)] \texttt{curl -s "https://get.sdkman.io" | bash}
|
|
49 |
\item[2)] \texttt{sdk install scala 2.13.10}
|
|
50 |
\end{itemize}
|
441
|
51 |
|
442
|
52 |
\subsubsection*{Windows / Linux Ubuntu}
|
441
|
53 |
|
442
|
54 |
\begin{itemize}
|
|
55 |
\item[0)] (if needed) \texttt{sudo apt-get remove scala-library scala}
|
444
|
56 |
\item[1)] {\fontsize{8.5}{8.5}\selectfont\texttt{sudo wget https://downloads.lightbend.com/scala/2.13.10/scala-2.13.10.deb}}
|
442
|
57 |
\item[2)] \texttt{sudo dpkg -i scala-2.13.10.deb}
|
|
58 |
\end{itemize}
|
170
|
59 |
|
|
60 |
\noindent
|
442
|
61 |
Other Linux distros: \texttt{sudo apt-get scala}\bigskip
|
182
|
62 |
|
444
|
63 |
\noindent In the end you should have something running like in your terminal/shell:
|
123
|
64 |
|
|
65 |
\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
|
|
66 |
$ scala
|
442
|
67 |
Welcome to Scala 2.13.10 (OpenJDK 64-Bit Server VM, Java 17.0.1).
|
123
|
68 |
Type in expressions for evaluation. Or try :help.
|
|
69 |
|
|
70 |
scala>
|
|
71 |
\end{lstlisting}%$
|
|
72 |
|
444
|
73 |
\noindent
|
|
74 |
If you want to use VS Code or Codium, you might want to also look into setting up
|
|
75 |
a key-shortcut for ``Run‐Selected‐Text‐In‐Active‐Terminal'' and also set up
|
|
76 |
syntax highlighting. Have a look at the Scala handout uploaded to KEATS for information.\bigskip
|
|
77 |
|
|
78 |
\noindent
|
|
79 |
Make sure you have checked out the template files for the Scala CWs and registered the
|
|
80 |
Github repository on KEATS. See whether you receive a test report when pushing some code.
|
442
|
81 |
\newpage
|
181
|
82 |
|
442
|
83 |
\subsection*{Task 1}
|
123
|
84 |
|
444
|
85 |
`Play' with the Scala REPL and try out the following queries. Observe
|
|
86 |
what Scala responds. Does it make sense?
|
123
|
87 |
|
|
88 |
\begin{lstlisting}[numbers=none]
|
|
89 |
scala> 2 + 2
|
|
90 |
scala> 1 / 2
|
|
91 |
scala> 1.0 / 2
|
|
92 |
scala> 1 / 2.0
|
|
93 |
scala> 1 / 0
|
|
94 |
scala> 1.0 / 0.0
|
|
95 |
scala> true == false
|
|
96 |
scala> true && false
|
|
97 |
scala> 1 > 1.0
|
|
98 |
scala> "12345".length
|
181
|
99 |
scala> List(1,2,1).size
|
|
100 |
scala> Set(1,2,1).size
|
265
|
101 |
scala> List(1) == List(1)
|
442
|
102 |
scala> Set(1,2,3) == Set(3,2,1)
|
265
|
103 |
scala> Array(1) == Array(1)
|
|
104 |
scala> Array(1).sameElements(Array(1))
|
335
|
105 |
\end{lstlisting}
|
|
106 |
|
442
|
107 |
\subsection*{Task 2 (Vals)}
|
272
|
108 |
|
444
|
109 |
Type in the value declarations below and observe Scala's responses. Explain what
|
|
110 |
is printed as the value for \texttt{x} in the last line. Is \texttt{z} re-assigned
|
|
111 |
in the 4th line?
|
|
112 |
|
|
113 |
\begin{lstlisting}[numbers=none]
|
442
|
114 |
scala> val z = 42
|
|
115 |
scala> z = z + 1
|
444
|
116 |
scala> val x = 2 * z
|
442
|
117 |
scala> val z = 466
|
444
|
118 |
scala> println(x)
|
|
119 |
\end{lstlisting}
|
271
|
120 |
|
444
|
121 |
|
|
122 |
\subsection*{Task 3 (Strings)}
|
|
123 |
|
|
124 |
Get familiar with constructing strings and printing strings
|
|
125 |
(i.e.~\texttt{println}, \texttt{mkString}, \texttt{toString}, \ldots)
|
301
|
126 |
|
|
127 |
\begin{lstlisting}[numbers=none]
|
442
|
128 |
scala> println("Hello " ++ "World")
|
444
|
129 |
scala> List(1,2,3,4).mkString("\n")
|
|
130 |
scala> List(1,2,3,4).mkString("(", "|", ")")
|
123
|
131 |
\end{lstlisting}
|
|
132 |
|
444
|
133 |
\subsection*{Task 4 (Functions)}
|
|
134 |
|
|
135 |
Write a function \texttt{miles2meters} taking an integer as argument
|
|
136 |
and generating an integer. You can assume that one mile is 1609 meters.
|
|
137 |
Remember that functions in Scala do not use the \texttt{return}-keyword.
|
|
138 |
|
|
139 |
\subsection*{Task 5 (If-Conditions)}
|
|
140 |
|
|
141 |
Make sure you understand if-conditions in Scala: They are
|
|
142 |
\emph{expressions}, meaning they need to calculate a result. For
|
|
143 |
example an \texttt{if} without an else-branch is nearly always
|
|
144 |
\emph{not} what you intend to write (because you are not meant to
|
|
145 |
change any ``state'' outside the expression). Also, remember the quirks
|
|
146 |
in Scala with if-conditions needing parentheses and there is no
|
|
147 |
\texttt{then}-keyword.
|
|
148 |
|
442
|
149 |
\begin{lstlisting}[numbers=none]
|
444
|
150 |
scala> val s1 = "foo"
|
|
151 |
scala> val s2 = "bar"
|
|
152 |
scala val s3 = "foobar"
|
|
153 |
scala> if (s1 == s2) print("equal") else print("unequal")
|
|
154 |
scala> if (s1 ++ s2 == s3) print("equal") else print("unequal")
|
343
|
155 |
\end{lstlisting}
|
|
156 |
|
444
|
157 |
\subsection*{Task 6 (For-Comprehensions, Harder)}
|
|
158 |
|
|
159 |
Write \texttt{for}-comprehensions that enumerate all triples containing the numbers 1 - 5. That is,
|
|
160 |
print the list
|
|
161 |
|
|
162 |
\[
|
|
163 |
\texttt{(1,1,1)}, \texttt{(2,1,1)}, \texttt{(3,1,1)} \;\ldots\; \texttt{(5,5,5)}
|
|
164 |
\]
|
|
165 |
|
|
166 |
\noindent
|
|
167 |
Modify the \texttt{for}-comprehensions such that only triples are
|
|
168 |
printed where the sum is divisible by 3. Then sort the list according
|
|
169 |
to the middle element (for this use \texttt{sortBy}).
|
|
170 |
|
|
171 |
\subsection*{Task 7 (Recursion, Advanced /Hard)}
|
|
172 |
|
|
173 |
Write a pretty print function for lists of integers which
|
|
174 |
``condenses'' elements in the list, meaning if there is a number
|
|
175 |
several times in a row, then print out \mbox{\texttt{n x e}}, where
|
|
176 |
\texttt{n} is the number of repetitions and \texttt{e} is the
|
|
177 |
number. For example
|
|
178 |
|
|
179 |
\begin{lstlisting}[numbers=none]
|
|
180 |
List(1,1,1,2,3,3) => List(3 x 1, 2, 2 x 3)
|
|
181 |
List(1,2,3,4,4,4) => List(1, 2, 3, 3 x 4)
|
|
182 |
List(1,1,1,1,1,1) => List(6 x 1)
|
|
183 |
List(1,1,1,2,1,1) => List(3 x 1, 2, 2 x 1)
|
|
184 |
\end{lstlisting}
|
|
185 |
|
|
186 |
You might like to define a separate function that first counts the occurences
|
|
187 |
for each element and returns a list of (Int, Int)-pairs .
|
|
188 |
|
123
|
189 |
\end{document}
|
|
190 |
|
|
191 |
%%% Local Variables:
|
|
192 |
%%% mode: latex
|
|
193 |
%%% TeX-master: t
|
|
194 |
%%% End:
|