Как определить "тип дизъюнкции" (типы объединения)?



один из способов, который имеет было предложено чтобы иметь дело с двойными определениями перегруженных методов, необходимо заменить перегрузку сопоставлением шаблонов:



object Bar {
def foo(xs: Any*) = xs foreach {
case _:String => println("str")
case _:Int => println("int")
case _ => throw new UglyRuntimeException()
}
}


этот подход требует, чтобы мы передали проверку статического типа аргументов foo. Было бы гораздо приятнее уметь писать



object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case _: String => println("str")
case _: Int => println("int")
}
}


Я могу сблизиться с Either, но это становится уродливым быстро с более чем двумя типами:



type or[L,R] = Either[L,R]

implicit def l2Or[L,R](l: L): L or R = Left(l)
implicit def r2Or[L,R](r: R): L or R = Right(r)

object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case Left(l) => println("str")
case Right(r) => println("int")
}
}


он выглядит как генерал (элегантный, эффективное) решение потребует определения Either3,Either4, .... Кто-нибудь знает альтернативное решение для достижения той же цели? Насколько мне известно, Scala не имеет встроенной "дизъюнкции типа". Кроме того, неявные преобразования, определенные выше, скрываются в стандартной библиотеке где-то, чтобы я мог просто импортировать их?

495   0  

Comments

    Ничего не найдено.