equal
deleted
inserted
replaced
122 // You do not want to write functions like contains, first, |
122 // You do not want to write functions like contains, first, |
123 // length and so on for every type of lists. |
123 // length and so on for every type of lists. |
124 |
124 |
125 def length_int_list(lst: List[Int]): Int = lst match { |
125 def length_int_list(lst: List[Int]): Int = lst match { |
126 case Nil => 0 |
126 case Nil => 0 |
127 case x::xs => 1 + length_int_list(xs) |
127 case _::xs => 1 + length_int_list(xs) |
128 } |
128 } |
129 |
129 |
130 length_int_list(List(1, 2, 3, 4)) |
130 length_int_list(List(1, 2, 3, 4)) |
131 |
131 |
132 def length_string_list(lst: List[String]): Int = lst match { |
132 def length_string_list(lst: List[String]): Int = lst match { |
144 case x::xs => 1 + length(xs) |
144 case x::xs => 1 + length(xs) |
145 } |
145 } |
146 length(List("1", "2", "3", "4")) |
146 length(List("1", "2", "3", "4")) |
147 length(List(1, 2, 3, 4)) |
147 length(List(1, 2, 3, 4)) |
148 |
148 |
149 length[Int](List(1, 2, 3, 4)) |
149 |
|
150 length[String](List(1, 2, 3, 4)) |
150 |
151 |
151 |
152 |
152 def map[A, B](lst: List[A], f: A => B): List[B] = lst match { |
153 def map[A, B](lst: List[A], f: A => B): List[B] = lst match { |
153 case Nil => Nil |
154 case Nil => Nil |
154 case x::xs => f(x)::map(xs, f) |
155 case x::xs => f(x)::map(xs, f) |
539 // "HAL".increment |
540 // "HAL".increment |
540 // |
541 // |
541 // you can avoid ugly fudges, like a MyString, by |
542 // you can avoid ugly fudges, like a MyString, by |
542 // using implicit conversions. |
543 // using implicit conversions. |
543 |
544 |
|
545 print("\n") |
|
546 print("""\n""") |
544 |
547 |
545 implicit class MyString(s: String) { |
548 implicit class MyString(s: String) { |
546 def increment = s.map(c => (c + 1).toChar) |
549 def increment = s.map(c => (c + 1).toChar) |
547 } |
550 } |
548 |
551 |
549 "HAL".increment.map(_.toInt) |
552 "HAL".increment |
550 |
553 |
551 |
554 |
552 // Abstract idea: |
555 // Abstract idea: |
553 // In that version implicit conversions were used to solve the |
556 // In that version implicit conversions were used to solve the |
554 // late extension problem; namely, given a class C and a class T, |
557 // late extension problem; namely, given a class C and a class T, |