Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package Chap2
- import scala.language.higherKinds
- trait AbstractTypes {
- type Rational[A]
- def makeRat[A](x: A, y: A): Rational[A]
- def numer[A](r: Rational[A]): A
- def denom[A](r: Rational[A]): A
- }
- trait AbstractOps extends AbstractTypes {
- def equalRat[A](x: Rational[A], y: Rational[A])(implicit numeric: Numeric[A]): Boolean = {
- import numeric._
- numer(x) * denom(y) == numer(y) * denom(x)
- }
- def addRat[A](x: Rational[A], y: Rational[A])(implicit numeric: Numeric[A]): Rational[A] = {
- import numeric._
- makeRat(numer(x) * denom(y) + numer(y) * denom(x), denom(x) * denom(y))
- }
- }
- object RationalsAsTuples extends AbstractOps {
- type Rational[A] = (A,A)
- def makeRat[A](x: A, y: A) = (x,y)
- def numer[A](r: (A, A)): A = r._1
- def denom[A](r: (A, A)): A = r._2
- }
- object TuplesAsFunctions extends AbstractOps {
- sealed trait Ind
- object Fst extends Ind
- object Snd extends Ind
- type Rational[A] = Ind => A
- def cons[A](x: A, y: A) = (i: Ind) => i match {
- case Fst => x
- case Snd => y
- }
- def fst[A](z: Rational[A]) = z(Fst)
- def snd[A](z: Rational[A]) = z(Snd)
- def makeRat[A](x: A, y: A) = cons(x,y)
- def numer[A](r: Rational[A]) = fst(r)
- def denom[A](r: Rational[A]) = snd(r)
- type Rat = Rational[Int]
- def printRat(x: Rat) = s"${numer(x)} / ${denom(x)}"
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement