Возможно, это не совсем ответ, но в любом случае это слишком длинный комментарий.
Сопоставление с образцом и возвращаемые значения функции - это две разные вещи.Бывший работает на уровне тип , последний на уровне значение .Когда вы сопоставляете шаблон с Bar
, вы сопоставляете шаблон с типом (как, например, Int
).Но когда вы возвращаете Bar
, вы возвращаете значение объекта case (как, например, 42
).
Сюръективная функция определяется как:
Для каждого члена y домена, существует по крайней мере один член x домена, такой что f (x) = y .
Теперь легко понять, почему эта проверка невозможна / невозможна.Что если ваш Bar
был не объектом case, а классом?Например,
final case class Bar(name: String, surname: String, age: Int)
Вы должны ожидать, что будет использоваться каждое возможное значение Bar
(например, имя = "Джон", фамилия = "Смит", возраст = 42).
Конечно, это не то, что вы хотели;Вы описали сценарий, в котором каждый подтип имеет ровно одного обитателя, потому что Bar
и Qux
в основном являются перечислениями, и я понимаю, почему такая проверка может иметь смысл для вас.Но это должно быть реализовано для общего случая произвольного числа жителей на (под) тип - необходимо убедиться, что кодомен содержит хотя бы одно значение типа Bar
, хотя бы одно значение типа Qux
и т. Д.... что не очень полезно.
Как я уже сказал, это не совсем ответ, но я хотел дать вам представление о том, что именно вы спрашиваете.:) Возможно, кто-то написал что-то с отражением и / или макросами, которые могли бы обеспечить такую проверку, но не в моих силахНадеемся, что с перечислениями Scala 3 вам никогда не понадобится писать такую функцию.