Size: a a a

Programming Offtop

2021 March 23

KD

Konstantin Dovnar in Programming Offtop
Ilmir
Расширение возвращаемого типа - несовместимое изменение. Его сужение - уже совместимое. Я про это написал.
Так. Я правильно понимаю, что fun x(): A | B возвращает либо A, либо B?
источник

KD

Konstantin Dovnar in Programming Offtop
Просто может я из коробки не так понимаю о чём речь.
источник

I

Ilmir in Programming Offtop
Konstantin Dovnar
Так. Я правильно понимаю, что fun x(): A | B возвращает либо A, либо B?
Да, и замена возвращаемого типа на A - совместимое изменение, потому что возвращаемый тип сужается. И код, который проверял на B теперь будет бесполезен, но в целом, код менять не нужно.
источник

KD

Konstantin Dovnar in Programming Offtop
Ilmir
Да, и замена возвращаемого типа на A - совместимое изменение, потому что возвращаемый тип сужается. И код, который проверял на B теперь будет бесполезен, но в целом, код менять не нужно.
Да. Мне казалось речь как-раз об обратном, что A заменится на A | B, что выглядит несовместимым.
источник

I

Ilmir in Programming Offtop
Konstantin Dovnar
Да. Мне казалось речь как-раз об обратном, что A заменится на A | B, что выглядит несовместимым.
Я же сигнатуры привёл! Было A -> R, стало A | B -> R.
источник

I

Ilmir in Programming Offtop
Замена до ->.
источник

KD

Konstantin Dovnar in Programming Offtop
Ilmir
Я же сигнатуры привёл! Было A -> R, стало A | B -> R.
Та шобы я тут ещё разбирался в этих ваших хаскеля-подобных штуках!
источник

АХ

Алексей Худяков... in Programming Offtop
Ilmir
Пришло, видимо, время для моего очередного лонгрида. Это будет rant и бугуртить я буду, как обычно, по поводу статус-кво в функциональных языках. Задену ещё заодно ООП языки и платформы, в том числе JVM. Статус-кво, о котором я буду говорить, опять идёт через хаскель от ML - это ADT.

Ещё до нового года я задался вопросом - что лучше, union типы или ADT с точки зрения дизайна языка. Тогда я не нашёл однозначного ответа. У обоих подходов есть свои плюсы и минусы. Но я уже тогда склонялся в сторону union типов, ибо неявное приведение A к A | B позволяет сократить код и не требует явного вызова конструкторов Left и Right монады Either.

Теперь я знаю точный ответ - ADT - это тупиковый путь развития и должны уступить место union типам. Дело в обратной совместимости. Допустим у нас есть функция f: A -> R и мы хотим добавить новый тип в параметры. В случае union типов функция примет вид f: A | B -> R, в случае же ADT она примет вид f: Either A B -> R. Вроде бы всё одно, отличие только синтаксическое. Тогда в чём же проблема? Проблема в вызывающей стороне. Из-за того, что для Either приходится явно вызывать конструктор, изменение сигнатуры несовместимо. Придётся менять весь пользовательский код. В случае же union типов такой проблемы нет.

Кстати, изменение возвращаемого типа тоже можно сделать обратно-совместимым, если язык поддерживает intersection типы, то есть замена f: A -> R на f: A -> R & T не ломает пользовательский код. Поэтому, кстати, я приветствую обеими руками Dotty. Там хотя бы source совместимость будет сохранена.

К сожалению, сделать изменение ещё и бинарно-совместимым на JVM не выйдет. Только если все типы в сигнатурах функций генерировать как java.lang.Object. Для intersection типов проблем особых нет - можно не менять генерируемый возвращаемый тип. Но для union типов так не выйдет, что ломает всю красоту и весь, мать его, пойнт!

Возвращаясь в нашим баранам, то есть к нулябельности и Result. Добавление нулябельности параметру и убирание нулябельности в возвращаемом значении - бинарно-совместимое изменение, если не использовать инлайн классы. Там из-за манглинга ещё @JvmName надо будет повесить. Вообще, такая проблема присутсвует и для примитивов, поэтому такое поведение соответствует нашему видению, что инлайн классы подобны примитивам. Убирание же Result и замена на сырой тип не бинарно-совместимое изменение, в отличие от некидания исключения. Конечно, исключения всё равно не видны в сигнатуре, а так хотя бы можно сказать, чтобы принимающая сторона проверила на существование значения. Но Result не решает проблему checked exceptions полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.

TL;DR: Result - это не очень, вернее даже, очень не.
union типу будут не очень очевидным мне образом взаимодействовать с параметрическими типами. Т.е. пусть есть функция, ∀a. Either Err a → X. Как закодировать такую функцию?

Сверх того замена ADT на union types будет ломать диспетчеризацию по типу (тайпклассы, например). А это _очень_ удачная языковая фича
источник

I

Igor in Programming Offtop
Ilmir
Пришло, видимо, время для моего очередного лонгрида. Это будет rant и бугуртить я буду, как обычно, по поводу статус-кво в функциональных языках. Задену ещё заодно ООП языки и платформы, в том числе JVM. Статус-кво, о котором я буду говорить, опять идёт через хаскель от ML - это ADT.

Ещё до нового года я задался вопросом - что лучше, union типы или ADT с точки зрения дизайна языка. Тогда я не нашёл однозначного ответа. У обоих подходов есть свои плюсы и минусы. Но я уже тогда склонялся в сторону union типов, ибо неявное приведение A к A | B позволяет сократить код и не требует явного вызова конструкторов Left и Right монады Either.

Теперь я знаю точный ответ - ADT - это тупиковый путь развития и должны уступить место union типам. Дело в обратной совместимости. Допустим у нас есть функция f: A -> R и мы хотим добавить новый тип в параметры. В случае union типов функция примет вид f: A | B -> R, в случае же ADT она примет вид f: Either A B -> R. Вроде бы всё одно, отличие только синтаксическое. Тогда в чём же проблема? Проблема в вызывающей стороне. Из-за того, что для Either приходится явно вызывать конструктор, изменение сигнатуры несовместимо. Придётся менять весь пользовательский код. В случае же union типов такой проблемы нет.

Кстати, изменение возвращаемого типа тоже можно сделать обратно-совместимым, если язык поддерживает intersection типы, то есть замена f: A -> R на f: A -> R & T не ломает пользовательский код. Поэтому, кстати, я приветствую обеими руками Dotty. Там хотя бы source совместимость будет сохранена.

К сожалению, сделать изменение ещё и бинарно-совместимым на JVM не выйдет. Только если все типы в сигнатурах функций генерировать как java.lang.Object. Для intersection типов проблем особых нет - можно не менять генерируемый возвращаемый тип. Но для union типов так не выйдет, что ломает всю красоту и весь, мать его, пойнт!

Возвращаясь в нашим баранам, то есть к нулябельности и Result. Добавление нулябельности параметру и убирание нулябельности в возвращаемом значении - бинарно-совместимое изменение, если не использовать инлайн классы. Там из-за манглинга ещё @JvmName надо будет повесить. Вообще, такая проблема присутсвует и для примитивов, поэтому такое поведение соответствует нашему видению, что инлайн классы подобны примитивам. Убирание же Result и замена на сырой тип не бинарно-совместимое изменение, в отличие от некидания исключения. Конечно, исключения всё равно не видны в сигнатуре, а так хотя бы можно сказать, чтобы принимающая сторона проверила на существование значения. Но Result не решает проблему checked exceptions полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.

TL;DR: Result - это не очень, вернее даже, очень не.
Боян, было еще в каком-то старом докладе Рича Хики 😌 (Maybe Not)
источник

I

Ilmir in Programming Offtop
Алексей Худяков
union типу будут не очень очевидным мне образом взаимодействовать с параметрическими типами. Т.е. пусть есть функция, ∀a. Either Err a → X. Как закодировать такую функцию?

Сверх того замена ADT на union types будет ломать диспетчеризацию по типу (тайпклассы, например). А это _очень_ удачная языковая фича
Не вижу пока, как тайпклассы сломаются. Если функция требует, к примеру, Ord, а ей передали, ну не знаю, комплексные числа, будет ошибка компиляции.
источник

IP

Iaroslav Postovalov in Programming Offtop
Ilmir
Пришло, видимо, время для моего очередного лонгрида. Это будет rant и бугуртить я буду, как обычно, по поводу статус-кво в функциональных языках. Задену ещё заодно ООП языки и платформы, в том числе JVM. Статус-кво, о котором я буду говорить, опять идёт через хаскель от ML - это ADT.

Ещё до нового года я задался вопросом - что лучше, union типы или ADT с точки зрения дизайна языка. Тогда я не нашёл однозначного ответа. У обоих подходов есть свои плюсы и минусы. Но я уже тогда склонялся в сторону union типов, ибо неявное приведение A к A | B позволяет сократить код и не требует явного вызова конструкторов Left и Right монады Either.

Теперь я знаю точный ответ - ADT - это тупиковый путь развития и должны уступить место union типам. Дело в обратной совместимости. Допустим у нас есть функция f: A -> R и мы хотим добавить новый тип в параметры. В случае union типов функция примет вид f: A | B -> R, в случае же ADT она примет вид f: Either A B -> R. Вроде бы всё одно, отличие только синтаксическое. Тогда в чём же проблема? Проблема в вызывающей стороне. Из-за того, что для Either приходится явно вызывать конструктор, изменение сигнатуры несовместимо. Придётся менять весь пользовательский код. В случае же union типов такой проблемы нет.

Кстати, изменение возвращаемого типа тоже можно сделать обратно-совместимым, если язык поддерживает intersection типы, то есть замена f: A -> R на f: A -> R & T не ломает пользовательский код. Поэтому, кстати, я приветствую обеими руками Dotty. Там хотя бы source совместимость будет сохранена.

К сожалению, сделать изменение ещё и бинарно-совместимым на JVM не выйдет. Только если все типы в сигнатурах функций генерировать как java.lang.Object. Для intersection типов проблем особых нет - можно не менять генерируемый возвращаемый тип. Но для union типов так не выйдет, что ломает всю красоту и весь, мать его, пойнт!

Возвращаясь в нашим баранам, то есть к нулябельности и Result. Добавление нулябельности параметру и убирание нулябельности в возвращаемом значении - бинарно-совместимое изменение, если не использовать инлайн классы. Там из-за манглинга ещё @JvmName надо будет повесить. Вообще, такая проблема присутсвует и для примитивов, поэтому такое поведение соответствует нашему видению, что инлайн классы подобны примитивам. Убирание же Result и замена на сырой тип не бинарно-совместимое изменение, в отличие от некидания исключения. Конечно, исключения всё равно не видны в сигнатуре, а так хотя бы можно сказать, чтобы принимающая сторона проверила на существование значения. Но Result не решает проблему checked exceptions полностью. Из-за как раз проблем обратной совместимости. Идеальное решение должно её принимать во внимание.

TL;DR: Result - это не очень, вернее даже, очень не.
Да кому этот Result нужен
источник

I

Ilmir in Programming Offtop
Igor
Боян, было еще в каком-то старом докладе Рича Хики 😌 (Maybe Not)
Спасибо, посмотрю.
источник

IP

Iaroslav Postovalov in Programming Offtop
Iaroslav Postovalov
Да кому этот Result нужен
Кроме корутинщиков этих, пусть страдают
источник

I

Ilmir in Programming Offtop
Алексей Худяков
union типу будут не очень очевидным мне образом взаимодействовать с параметрическими типами. Т.е. пусть есть функция, ∀a. Either Err a → X. Как закодировать такую функцию?

Сверх того замена ADT на union types будет ломать диспетчеризацию по типу (тайпклассы, например). А это _очень_ удачная языковая фича
А функция будет выглядеть как forall a a | Err -> X.
источник

АХ

Алексей Худяков... in Programming Offtop
Ilmir
А функция будет выглядеть как forall a a | Err -> X.
А как определить как Err надо обрабатывать Err или a?
источник

с#

саша сок #KotlinGang... in Programming Offtop
Ilmir
И да, "стабильный" не означает "без багов". "Стабильный" означает "гарантия обратной совместимости".
стабильный != не падает ?
источник

IP

Iaroslav Postovalov in Programming Offtop
саша сок #KotlinGang
стабильный != не падает ?
В контексте Котлина - да
источник

IP

Iaroslav Postovalov in Programming Offtop
саша сок #KotlinGang
стабильный != не падает ?
В контексте атомных ядер - не распадается
источник

АT

Андрей Tama in Programming Offtop
Iaroslav Postovalov
В контексте Котлина - да
В контексте любого ЯП и софта в целом*
источник

IP

Iaroslav Postovalov in Programming Offtop
Андрей Tama
В контексте любого ЯП и софта в целом*
Chrome Stable - не падает
источник