Re[5]: А идет ли развитие в области альтернатив исключениям?
От: Evgeny.Panasyuk Россия  
Дата: 26.03.16 13:01
Оценка: +2
Здравствуйте, _hum_, Вы писали:

EP>>От Optional отличие только в том, что внутри могут хранится разные исключения, а не только bad_optional_access.

__>в boost::optional<T> тоже зашит эксепшн?

Если он пустой, и безусловно доставать из него значение — да, будет исключение.

__>мне нравится сама идея — возможность самому расширять любой тип значением undefined, чтобы замкнуть хотя бы какие-то операции


Мне не нравится инфицирование всех выражений undefined'ом.

__>>>мм... может, я неправильно выразился. я имел ввиду подход, когда вместо того, чтобы считать a/0 неопределенностью, просто расширяют тип вещественных чисел за счет введения значения NaN, для которого полагается

__>>> a @ NaN -> NaN
__>>> NaN @ NaN -> NaN
__>>>(здесь @ — любая операция)
EP>>Это аппликативный функтор, а не монада.
__>а я думал, это что-то из разряда хаскелловской монады Maybe

Каждая монада это аппликативный функтор, но не наоборот. Если использовать именно монадические свойства Maybe, например через Haskell'евский do-синтаксис, то на первом Nothing'е весь поток управления остановится, собственно для этого и происходит заворачивание в do-синтаксис, чтобы был контроль над потоком управления (что особенно видно если вручную расписать замыкания и bind'ы).

Если же речь идёт про лифтование произвольных операций как в твоей табличке выше, то для этого достаточно аппликативного функтора.

__>>>в этом случае даже если у вас произойдет деление на нуль, поток управления все равно продолжит течь, как ни в чем не бывало, предоставляя вам свободу выбора, где делать проверку на валидность соответствующего значения.

EP>>Монада в этом контексте как раз и отличается от аппликативного функтора тем что может прервать поток управления, так как весь этот поток управления протекает через неё.
__>ну, я не спец. но интуиция мне подсказывает, что монады в чистом функциональном языке программирования вводились не для того, чтобы туда протаскивать такие императивные вещи, как исключения. возможно, я ошибаюсь.

Их изначально именно и протаскивали ради императивных вещей, в частности таких как ввод-вывод.
Собственно исключения в Haskell именно как монада и реализованы.

__>>>в случае же с эксепшенами обычный поток управления с необходимостью будет прерываться. а значит, программисту придется "всовывать" в обычную логику еще и логику перехватов и обработок исключений.


EP>>Вообще-то наоборот — с исключениями мы имеем обычную логику не замусоренную проверками и обработками. Обработка же обычно происходит где-то наверху стэка.


__>ну как же не замусоренную, если вам придется продумывать "а что будет, если вот именно в этом месте поток исполнения прервется и пойдет по совсем другому пути" и вставлять предусматривающий такой ход код?


Если речь идёт про Exception safety, то на C++ обычно всё что требуется для basic guarantee было бы и без исключений. Если же речь про strong guarantee, которую часто ассоциируют с транзакционностью — то её придётся "продумывать" в любом языке

__>кроме того, одна и та же нештатная ситуация может быть критической в одном случае и некритической в другом. и если она может возникнуть, например, в функции f() которую вы используете в нескольких местах, то вам придется во всех местах использования ставить трай-кэтчи, замусоривая код,


Почему же во всех местах использования? Только в тех, где это критично.

__>тогда как в случае с аналогом NaN такой необходимости не будет.


Если в каком-то месте критично чтобы вызов f() прошёл нормально, вернув нормальный результат, то и в случае с NaN'ами придётся городить проверки

__>другими словами, ексепшены принуждают программиста под угрозой повалить программу ловить их всюду,


Под какой угрозой? Исключения обычно ловятся в очень малом количестве мест, как раз позволяя убрать мусор присутствующий без них на кодах возвратов.

__>тогда как "NaN-подход" просто дает возможность узнать валидность вычисления там, где эта валидность действительно принципиальна для программиста.


Почему эта мифическая угроза заставляет ловить везде исключения, но при этом не заставляет проверять NaN-ы?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.