sealed trait User
case class ExternalUser(name: String, email: String) extends User
case class InternalUser(tag: String, email: String) extends User
val user: User = ...
user match {
case u: ExternalUser =>
println(s"${u.name}")
case InternalUser(tag, email) =>
println(s"${tag}")
}
When should I use one as oppose to the other and why.