Но это кажется слишком искусственным, оно ясно демонстрирует, что «F # против try / with / finally». Почему это так?
Полагаю, F # вообще может быть "против" обработки исключений. Ради совместимости .NET он должен поддерживать их, но в основном в функциональном программировании * нет обработки исключений .
Подбрасывание / отлов исключений означает выполнение «прыжков в никуда», которые даже не замечены системой типов, что в корне противоречит философии функциональности.
Вы можете использовать чисто функциональный (монадический) код для переноса исключений. Все ошибки обрабатываются через значения в терминах базовой системы типов и без скачков / побочных эффектов.
Вместо написания функции
let readNumber() : int = ...
, который может выдавать произвольные исключения, вы просто заявите
let readNumber() : int option = ...
, который автоматически очищает эту точку по сигнатуре типа.
* Это не значит, что мы не справляемся с исключительными ситуациями, это просто вид обработки исключений в .NET / C ++.