1) что мешает иметь и адт и юньоны как в скале? 2) Это не дает магической обратной совместимости точно точно можно сказать что просто дописав ещё один кейс в адт, даже сигнатуру не нужно будет менять. А ещё есть тайпклассы с имплиситами у которых дело ещё лучше эта штука работает, ты прост дописываешь ещё одну имплементацию и все работает зашибись и не ломается, ну или ТФ, где ты можешь довешивать дополнительные фички не трогая старые и ещё тонна приемов 3) добавление добра в виде A -> A | B либо ломает код, либо оно аппендонли. Если оно аппенд-онли, то это нарушение SRP (и этот чел пишет язык) и должно быть не f A|B -> C, а f A -> B и g B -> C. А если нет - оно так или иначе потребует переписывания кода во всех местах вызова, на которые конпель не ткнет, и тут все байки про "обратную совместимость" идут коту под хвост. 4) адт в этом плане рабтает лучше, ибо оно обозвано одним классом который можно не менять при добавлении новых членов. 5) То, ломает ли код замена типа на подтип заависит его вариантности, если код инвариантен, то такая замена его сломает (чел пишет язык но не знает таких элементарных вещей, чё он за язык может написать?) 6) наллабл на не наллабл и на оборот это нефига не совместимые изменения, вы делаете взаимо исключающие изменения в протоколе, и то что их можно лихо игнорировать - это не достоинство а недостаток. 7) И правильно - не совместимым изменения протокола должны отвечать бинарно несовместимые вещи. Вся соль наличия резалта чтобы сломать весь код который надеется получать что-то без ошибки. Потому что он станет получать что-то с ошибкой или другим свойством. И это нужно переписать РУКАМИ и задать поведение - тут магия не возможна, забивание болта на подобные изменения ещё ни к чему хорошему никогда не приводили.
1. Можно.
2. Нельзя. Как я в
Either
добавлю новый конструктор?
3. Расширение возвращаемого типа - несовместимое изменение. Ещё раз. Конкретно тебе я не запрещаю ломать код. Ломай сколько хочешь. Конкретно этот рант я написал после того, как ещё раз сломал бинарную совместимость и понял, что если бы в JVM были юнионы - мне этого делать не пришлось бы. Да, я пишу язык и от меня немного другие требования. В том числе к совместимости.
4. См 2. Как я добавлю новый конструктор в
Either
. Во, придумал аналогию. Смотри, у тебя есть класс
String
. Но от него наследоваться ты не можешь, ибо он стандартный и финальный. Функции-расширения как бы добавляют функциональность в класс, не наследуясь от него, точно так же, как и юнион типы позволяют расширить другой юнион.
5. Я рассматривал один (два) конкретный пример. Вариантность - это уже к дженерикам и там свои интересные заморочки. NB: И где этот мальчик увидел дженерики в примерах?
6. Прочти ещё раз и напиши нормально. Так дойдёт до того, что баг фиксы с добавлением обработки особого случая будут несовместимым изменением.
7. Неа, не понял ты написанного, а сразу писать комментарий.
Занятно. Я только что понял, что у меня появился хейтер. Причём такой, который хейтит не мои идеи, или взгляды, как
@happy_bracket (Скобка - ты няша, несмотря на наши различия во взглядах на ХКТ), а именно меня. Что я, интересно, сделал? Не согласился с мнением, что опшн лучше нулябельности? Так вот и аргументы, почему он хуже. Но нет, надо не вести аргументированную дискуссию, как
@sad_bracket, а накидывать "чё он за язык может написать". А также полностью перевирать оппонента "не совместимым изменения протокола" - я же объяснил, почему эти изменения протокола совместимые и не должны ломать пользовательский код. Подобные полемические приёмы и в до-интернетовскую не работали, а теперь, когда всё сохраняется и может быть скопировано - тем более.