I'd like to express a contract that models a homogeneous list containing an ADT.
Let's say I have an ADT
sealed trait Letter
case object A extends Letter
case object B extends Letter
If I declare a contract like
case class Letters(letters: List[Letter])
I can instantiate the class as
Letters(Set(A, A))
Letters(Set(B, B))
but also as
Letters(Set(A, B))
I'd like to make this last case illegal at compile time.