KD
что fun x(): A | B
возвращает либо A
, либо B
?Size: a a a
KD
что fun x(): A | B
возвращает либо A
, либо B
?KD
I
что fun x(): A | B
возвращает либо A
, либо B
?KD
A
заменится на A | B
, что выглядит несовместимым.I
A
заменится на A | B
, что выглядит несовместимым.I
KD
АХ
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 полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.∀a. Either Err a → X
. Как закодировать такую функцию? 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 полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.I
∀a. Either Err a → X
. Как закодировать такую функцию? IP
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 полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.I
IP
I
∀a. Either Err a → X
. Как закодировать такую функцию? forall a a | Err -> X
.АХ
forall a a | Err -> X
.с#
IP
IP
АT
IP