user3324500 February 2016

Is it possible to "mix in: additional type constraints

I'd like to add constraints to a type field in a trait as additional traits are mixed in but can't seem to find a way to express it. Any help appreciated:

trait Events { def be() = println("B") }
trait Create { self : Events => def create() = println("C") }
trait Update { self : Events => def update() = println("U") }
trait Delete { self : Events => def delete() = println("D") }

trait EventHandler {
  type MyEvents <: Events
  val myEvents : MyEvents
}

trait Creation {
  self: EventHandler =>
  override type MyEvents <: Create
}

def h(events: EventHandler with Creation) : Unit = {
  events.myEvents.be()  // <== wont' compile
  events.myEvents.create()
}

Compiler says:

<console>:12: error: value be is not a member of events.MyEvents

Answers


LaloInDublin February 2016

Ok some of my previous comments were in error, I didn't realize self typing hides the interface you're working with and thus is not the same as "extends". Here's a link that explains it better:

http://www.andrewrollins.com/2014/08/07/scala-cake-pattern-self-type-annotations-vs-inheritance/

There's too many logical conflicts this creates in your code, and so I won't attempt to rework it here. Those conflicts in your code come down to this - some of your logic is opening up the trait API, and some of your self-types are then immediately hiding them. Here's an example that helped me understand why

trait A {
   def x:Int
 }
  trait B { self:A =>

  }

  def workWithB(b:B): Unit ={
    b.x  //wont' compile, is forced hidden.
  }

Post Status

Asked in February 2016
Viewed 3,524 times
Voted 8
Answered 1 times

Search




Leave an answer