с#
Size: a a a
с#
АХ
AM
I
AM
I
A
к A | B
позволяет сократить код и не требует явного вызова конструкторов Left
и Right
монады Either
.f: A -> R
и мы хотим добавить новый тип в параметры. В случае union типов функция примет вид f: A | B -> R
, в случае же ADT она примет вид f: Either A B -> R
. Вроде бы всё одно, отличие только синтаксическое. Тогда в чём же проблема? Проблема в вызывающей стороне. Из-за того, что для Either
приходится явно вызывать конструктор, изменение сигнатуры несовместимо. Придётся менять весь пользовательский код. В случае же union типов такой проблемы нет.f: A -> R
на f: A -> R & T
не ломает пользовательский код. Поэтому, кстати, я приветствую обеими руками Dotty. Там хотя бы source совместимость будет сохранена.@JvmName
надо будет повесить. Вообще, такая проблема присутсвует и для примитивов, поэтому такое поведение соответствует нашему видению, что инлайн классы подобны примитивам. Убирание же Result и замена на сырой тип не бинарно-совместимое изменение, в отличие от некидания исключения. Конечно, исключения всё равно не видны в сигнатуре, а так хотя бы можно сказать, чтобы принимающая сторона проверила на существование значения. Но Result не решает проблему checked exceptions полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.AM
I
I
A
к A | B
позволяет сократить код и не требует явного вызова конструкторов Left
и Right
монады Either
.f: A -> R
и мы хотим добавить новый тип в параметры. В случае union типов функция примет вид f: A | B -> R
, в случае же ADT она примет вид f: Either A B -> R
. Вроде бы всё одно, отличие только синтаксическое. Тогда в чём же проблема? Проблема в вызывающей стороне. Из-за того, что для Either
приходится явно вызывать конструктор, изменение сигнатуры несовместимо. Придётся менять весь пользовательский код. В случае же union типов такой проблемы нет.f: A -> R
на f: A -> R & T
не ломает пользовательский код. Поэтому, кстати, я приветствую обеими руками Dotty. Там хотя бы source совместимость будет сохранена.@JvmName
надо будет повесить. Вообще, такая проблема присутсвует и для примитивов, поэтому такое поведение соответствует нашему видению, что инлайн классы подобны примитивам. Убирание же Result и замена на сырой тип не бинарно-совместимое изменение, в отличие от некидания исключения. Конечно, исключения всё равно не видны в сигнатуре, а так хотя бы можно сказать, чтобы принимающая сторона проверила на существование значения. Но Result не решает проблему checked exceptions полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.AW
AW
V
KD
>Из-за того, что для Either приходится явно вызывать конструктор, изменение сигнатуры несовместимо.
Как по мне — это как-раз плюс.AM
IP
IP
I
>Из-за того, что для Either приходится явно вызывать конструктор, изменение сигнатуры несовместимо.
Как по мне — это как-раз плюс.A
, а теперь делает A | B
, то для пользовательского кода, который требует только A
и изменений не должно быть.KD
A
, а теперь делает A | B
, то для пользовательского кода, который требует только A
и изменений не должно быть.A | B
, которая поменяла свою логику и теперь, как я понимаю, может вернуть не A
, а либо A
, либо B
, может для кого-то всегда возвращать A
?I
A | B
, которая поменяла свою логику и теперь, как я понимаю, может вернуть не A
, а либо A
, либо B
, может для кого-то всегда возвращать A
?