Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. package Chap2
  2.  
  3. import scala.language.higherKinds
  4.  
  5. trait AbstractTypes {
  6.  
  7. type Rational[A]
  8.  
  9. def makeRat[A](x: A, y: A): Rational[A]
  10.  
  11. def numer[A](r: Rational[A]): A
  12.  
  13. def denom[A](r: Rational[A]): A
  14. }
  15.  
  16. trait AbstractOps extends AbstractTypes {
  17.  
  18. def equalRat[A](x: Rational[A], y: Rational[A])(implicit numeric: Numeric[A]): Boolean = {
  19. import numeric._
  20. numer(x) * denom(y) == numer(y) * denom(x)
  21. }
  22.  
  23.  
  24. def addRat[A](x: Rational[A], y: Rational[A])(implicit numeric: Numeric[A]): Rational[A] = {
  25. import numeric._
  26. makeRat(numer(x) * denom(y) + numer(y) * denom(x), denom(x) * denom(y))
  27. }
  28. }
  29.  
  30. object RationalsAsTuples extends AbstractOps {
  31.  
  32. type Rational[A] = (A,A)
  33.  
  34. def makeRat[A](x: A, y: A) = (x,y)
  35.  
  36. def numer[A](r: (A, A)): A = r._1
  37.  
  38. def denom[A](r: (A, A)): A = r._2
  39. }
  40.  
  41. object TuplesAsFunctions extends AbstractOps {
  42.  
  43. sealed trait Ind
  44. object Fst extends Ind
  45. object Snd extends Ind
  46.  
  47. type Rational[A] = Ind => A
  48.  
  49.  
  50. def cons[A](x: A, y: A) = (i: Ind) => i match {
  51. case Fst => x
  52. case Snd => y
  53. }
  54.  
  55. def fst[A](z: Rational[A]) = z(Fst)
  56. def snd[A](z: Rational[A]) = z(Snd)
  57.  
  58.  
  59. def makeRat[A](x: A, y: A) = cons(x,y)
  60.  
  61. def numer[A](r: Rational[A]) = fst(r)
  62.  
  63. def denom[A](r: Rational[A]) = snd(r)
  64.  
  65. type Rat = Rational[Int]
  66.  
  67. def printRat(x: Rat) = s"${numer(x)} / ${denom(x)}"
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement