Advertisement
Guest User

Untitled

a guest
Apr 16th, 2014
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. sealed trait Expression[A] {
  2. def replace[B](a: Expression[B], b: Expression[B]): Expression[?]
  3. }
  4.  
  5. trait Variable[A] extends Expression[A] {
  6. def replace[B](a: Expression[B], b: Expression[B]) =
  7. if (a == this) b else this
  8. }
  9.  
  10. case class Sequence[A <: Expression[B]](values: Seq[A]) extends Expression[A] {
  11. def replace[B](a: Expression[B], b: Expression[B]) =
  12. if (a == this) b
  13. else Sequence(values.map(_.replace(a, b)))
  14. }
  15.  
  16. sealed trait Expression[A, ThisType <: Expression[A, ThisType]] {
  17. def replace[B,C <: Expression[B,C]](a: Expression[B,C], b: Expression[B,C]): ThisType
  18. }
  19.  
  20. trait Variable[A] extends Expression[A, Variable[A]] {
  21. def replace[B,C <: Expression[B,C]](a: Expression[B,C], b: Expression[B,C]) =
  22. if (a == this) b.asInstanceOf[Variable[A]] else this
  23. }
  24.  
  25. case class Sequence[A <: Expression[_,A]](values: Seq[A]) extends Expression[A, Sequence[A]] {
  26. def replace[B,C <: Expression[B,C]](a: Expression[B,C], b: Expression[B,C]) =
  27. if (a == this) b.asInstanceOf[Sequence[A]]
  28. else Sequence(values.map(_.replace(a, b)))
  29. }
  30.  
  31. class Sequence[+A] {
  32. def +: [B >: A](b: B): Sequence[B] = {
  33. /* Build the new sequence with b at the beginning and this sequence's elments after */
  34. }
  35. }
  36.  
  37. def replace[B >: A](a: Expression[B], b: Expression[B]): Expression[B]
  38.  
  39. case class Sequence[A] (values: Seq[Expression[A]]) extends Expression[A] {
  40. def replace[B <: A](a: Expression[A], b: Expression[B]) {
  41. // (Code in initial question)
  42. }
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement