progs/lecture3.scala
changeset 323 1f8005b4cdf6
parent 321 7b0055205ec9
child 325 ca9c1cf929fa
equal deleted inserted replaced
322:755d165633ec 323:1f8005b4cdf6
     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
   207 case object D extends RomanDigit 
   238 case object D extends RomanDigit 
   208 case object M extends RomanDigit 
   239 case object M extends RomanDigit 
   209 
   240 
   210 type RomanNumeral = List[RomanDigit] 
   241 type RomanNumeral = List[RomanDigit] 
   211 
   242 
   212 List(X,I)
   243 List(X,I,M,D)
   213 
   244 
   214 /*
   245 /*
   215 I    -> 1
   246 I    -> 1
   216 II   -> 2
   247 II   -> 2
   217 III  -> 3
   248 III  -> 3
   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