Здравствуйте, korvin_, Вы писали: _>Сейчас это нигде не указано, кроме, разве что документации. Но вы не про документацию писали, а систему типов.
С моей точки зрения это примерно одно и то же. Вопрос именно в том, какой тип имеет результат операции new.
_>Удачи убедить хоть кого-нибудь писать на таком языке.
Возможно, вы правы.
_>И как это должно выглядеть?
Давайте повернём вопрос в другую сторону: а как это сделано в Haskell?
Я бегло почитал — ребята пишут, что исключения не требуют специальной языковой поддержки, т.к. для них достаточно монад. Ну, ок.
А что произойдёт, если хаскелл не смог сконструировать Add из Expr и Expr из-за OutOfMemory или StackOverflow?
_>-- ну и print, конечно, должен иметь сигнатуру вида _>-- print :: Show a => (a | OOM) -> (IO () | OOM) _>[/haskell]
_>То есть фактически OOM придётся писать буквально везде. Добавим сюда также StackOverflow, DivisionByZero и чёрт знает что ещё.
Я не очень понимаю, почему нам придётся писать OOM буквально везде. В первом варианте вы не писали никаких сигнатур у Add Expr Expr, а добавление OOM почему-то его потребовало.
Почему нельзя было просто добавить OOM в определение Expr как одной из альтернатив?
_>Удачи убедить хоть кого-нибудь писать на таком языке, да и самому не свихнуться от такого.
На первый взгляд, Хаскелл как раз такой язык. В том смысле, что я не могу просто взять и сделать throw в произвольном месте, не меняя сигнатуру функции (как это сделано в C++ и C#)
Уйдемте отсюда, Румата! У вас слишком богатые погреба.