
diff -r b217232e9246 -r 828326d1b3b2 handouts/pep-ho.tex
--- a/handouts/pep-ho.tex	Tue Dec 03 11:07:09 2019 +0000
+++ b/handouts/pep-ho.tex	Mon Jan 27 10:18:13 2020 +0000
@@ -42,6 +42,44 @@
 % https://www.matthewgerstman.com/map-filter-reduce/
 
 
+% Timing
+%
+% xs.map(x => (x, xs.count(_==x)))
+%
+% vs  xs.groupBy(identity)
+%
+% first is quadratic, while second is linear.
+
+% contrast map with a for loop in imperative languages
+%
+% Let’s use a simple example of calculating sales tax on an array of
+% prices.
+%
+%       const prices = [19.99, 4.95, 25, 3.50];
+%       let new_prices = [];
+%
+%       for(let i=0; i < prices.length; i++) {
+%          new_prices.push(prices[i] * 1.06);
+%       }
+%
+% We can achieve the same results using .map():
+%
+% const prices = [19.99, 4.95, 25, 3.50]; 
+% let new_prices = prices.map(price => price * 1.06);
+%
+% The syntax above is condensed so let’s walk through it a bit. The
+% .map() method takes a callback, which can be thought of as a function.
+% That’s what is between the parentheses. The variable price is the name
+% that will be used to identify each value. Since there’s only one
+% input, we can omit the usual parentheses around the parameters.
+
+% potentially a worked example? Tetris in scala.js
+%  
+% https://medium.com/@michael.karen/learning-modern-javascript-with-tetris-92d532bcd057
+%
+% Scala videos
+%    https://www.youtube.com/user/DrMarkCLewis
+
 \begin{document}
 \fnote{\copyright{} Christian Urban, King's College London, 2017, 2018, 2019}
 
@@ -1009,6 +1047,16 @@
 all aggregate functions are pre-defined and often you have to write your
 own recursive function for this.
 
+\subsection*{Always Produce a Result! No Exceptions!}
+%
+%Function should always produce a value. Exception is not thrown.
+%Whenever there is a possibility of non-value result (exception, void,
+%undefined, null, etc.), it should be incorporated in the result type.
+%Such types include but not limited to
+%
+%Option[T]
+
+
 \subsection*{Higher-Order Functions}
 
 Functions obviously play a central role in functional programming. Two simple




