206 |
206 |
207 // BUT since we are completely IMMUTABLE, this is |
207 // BUT since we are completely IMMUTABLE, this is |
208 // virtually of not concern to us. |
208 // virtually of not concern to us. |
209 |
209 |
210 |
210 |
|
211 |
|
212 // another example about Fractions |
|
213 import scala.language.implicitConversions |
|
214 import scala.language.reflectiveCalls |
|
215 |
|
216 |
|
217 case class Fraction(numer: Int, denom: Int) { |
|
218 override def toString = numer.toString + "/" + denom.toString |
|
219 |
|
220 def +(other: Fraction) = Fraction(numer + other.numer, denom + other.denom) |
|
221 def /(other: Fraction) = Fraction(numer * other.denom, denom * other.numer) |
|
222 def /% (other: Fraction) = Fraction(numer * other.denom, denom * other.numer) |
|
223 |
|
224 } |
|
225 |
|
226 implicit def Int2Fraction(x: Int) = Fraction(x, 1) |
|
227 |
|
228 |
|
229 val half = Fraction(1, 2) |
|
230 val third = Fraction (1, 3) |
|
231 |
|
232 half + third |
|
233 half / third |
|
234 |
|
235 // not sure if one can get this to work |
|
236 // properly, since Scala just cannot find out |
|
237 // if / is for ints or for Fractions |
|
238 (1 / 3) + half |
|
239 (1 / 2) + third |
|
240 |
|
241 // either you have to force the Fraction-type by |
|
242 // using a method that is not defined for ints |
|
243 (1 /% 3) + half |
|
244 (1 /% 2) + third |
|
245 |
|
246 |
|
247 // ...or explicitly give the type in order to allow |
|
248 // Scala to do the conversion to Fractions |
|
249 ((1:Fraction) / 3) + half |
|
250 (1 / (3: Fraction)) + half |
211 |
251 |
212 |
252 |
213 |
253 |
214 // DFAs in Scala |
254 // DFAs in Scala |
215 //=============== |
255 //=============== |