5 // |
5 // |
6 // option type |
6 // option type |
7 // higher-order function |
7 // higher-order function |
8 |
8 |
9 |
9 |
|
10 def add(x: Int, y: Int) : Int = x + y |
|
11 |
|
12 def plus5(x: Int) : Int = add(5, x) |
|
13 |
|
14 plus5(6) |
|
15 |
|
16 def add2(x: Int)(y: Int) : Int = x + y |
|
17 |
|
18 def plus3(y: Int) : Int => Int = add2(3)(y) |
|
19 |
|
20 plus3(9) |
|
21 |
|
22 List(1,2,3,4,5).map(add2(3)) |
|
23 List(1,2,3,4,5).map(add(3, _)) |
|
24 |
|
25 type Pos = (Int, Int) |
|
26 |
|
27 def test(p: Pos) = { |
|
28 if (p._1 < 5 && p._2 < 5) { |
|
29 Some(p) |
|
30 } |
|
31 } |
|
32 |
|
33 val l = List((1,2), (5,3), (2,5), (1,3)) |
|
34 |
|
35 l.map(test).flatten |
10 |
36 |
11 // Recursion Again ;o) |
37 // Recursion Again ;o) |
12 //==================== |
38 //==================== |
13 |
39 |
14 |
40 |
55 // some starting URLs for the crawler |
81 // some starting URLs for the crawler |
56 val startURL = """https://nms.kcl.ac.uk/christian.urban/""" |
82 val startURL = """https://nms.kcl.ac.uk/christian.urban/""" |
57 |
83 |
58 crawl(startURL, 2) |
84 crawl(startURL, 2) |
59 |
85 |
60 |
86 for (x <- List(1,2,3,4,5,6)) println(x) |
61 |
87 |
62 // a primitive email harvester |
88 // a primitive email harvester |
63 def emails(url: String, n: Int) : Set[String] = { |
89 def emails(url: String, n: Int) : Set[String] = { |
64 if (n == 0) Set() |
90 if (n == 0) Set() |
65 else { |
91 else { |
66 println(s" Visiting: $n $url") |
92 println(s" Visiting: $n $url") |
67 val page = get_page(url) |
93 val page = get_page(url) |
68 val new_emails = email_pattern.findAllIn(page).toSet |
94 val new_emails = email_pattern.findAllIn(page).toSet |
69 new_emails ++ (for (u <- get_all_URLs(page)) yield emails(u, n - 1)).flatten |
95 new_emails ++ (for (u <- get_all_URLs(page).par) yield emails(u, n - 1)).flatten |
70 } |
96 } |
71 } |
97 } |
72 |
98 |
73 emails(startURL, 2) |
99 emails(startURL, 3) |
74 |
100 |
75 |
101 |
76 // if we want to explore the internet "deeper", then we |
102 // if we want to explore the internet "deeper", then we |
77 // first have to parallelise the request of webpages: |
103 // first have to parallelise the request of webpages: |
78 // |
104 // |
107 // the first n prefixes of xs |
133 // the first n prefixes of xs |
108 // for 1 => include xs |
134 // for 1 => include xs |
109 |
135 |
110 def moves(xs: List[Int], n: Int) : List[List[Int]] = (xs, n) match { |
136 def moves(xs: List[Int], n: Int) : List[List[Int]] = (xs, n) match { |
111 case (Nil, _) => Nil |
137 case (Nil, _) => Nil |
112 case (xs, 0) => Nil |
138 case (_, 0) => Nil |
113 case (x::xs, n) => (x::xs) :: moves(xs, n - 1) |
139 case (y::ys, n) => xs :: moves(ys, n - 1) |
114 } |
140 } |
115 |
141 |
116 |
142 |
117 moves(List(5,1,0), 1) |
143 moves(List(5,1,0), 1) |
118 moves(List(5,1,0), 2) |
144 moves(List(5,1,0), 2) |
179 |
205 |
180 |
206 |
181 // User-defined Datatypes |
207 // User-defined Datatypes |
182 //======================== |
208 //======================== |
183 |
209 |
|
210 abstract class Tree |
|
211 case class Leaf(x: Int) extends Tree |
|
212 case class Node(s: String, left: Tree, right: Tree) extends Tree |
|
213 |
|
214 List(Leaf(20), Node("foo", Leaf(1), Leaf(2))) |
184 |
215 |
185 sealed abstract class Colour |
216 sealed abstract class Colour |
186 case object Red extends Colour |
217 case object Red extends Colour |
187 case object Green extends Colour |
218 case object Green extends Colour |
188 case object Blue extends Colour |
219 case object Blue extends Colour |
|
220 case object Yellow extends Colour |
189 |
221 |
190 |
222 |
191 def fav_colour(c: Colour) : Boolean = c match { |
223 def fav_colour(c: Colour) : Boolean = c match { |
192 case Red => false |
|
193 case Green => true |
224 case Green => true |
194 case Blue => false |
225 case _ => false |
195 } |
226 } |
196 |
227 |
197 fav_colour(Green) |
228 fav_colour(Green) |
198 |
229 |
199 // ... a tiny bit more useful: Roman Numerals |
230 // ... a tiny bit more useful: Roman Numerals |
269 // User-defined Datatypes and Pattern Matching |
300 // User-defined Datatypes and Pattern Matching |
270 //============================================= |
301 //============================================= |
271 |
302 |
272 // trees |
303 // trees |
273 |
304 |
|
305 |
|
306 |
|
307 // expressions |
|
308 |
274 sealed abstract class Exp |
309 sealed abstract class Exp |
275 case class N(n: Int) extends Exp // for numbers |
310 case class N(n: Int) extends Exp // for numbers |
276 case class Plus(e1: Exp, e2: Exp) extends Exp |
311 case class Plus(e1: Exp, e2: Exp) extends Exp |
277 case class Times(e1: Exp, e2: Exp) extends Exp |
312 case class Times(e1: Exp, e2: Exp) extends Exp |
278 |
313 |