Здесь нет аргументов в том, что в Haskell существует множество механизмов для обработки ошибок и их правильной обработки. Ошибка monad, Либо, Может быть, исключения и т.д.
Итак, почему он чувствует себя намного более прямолинейно, создавая исключающий код код на других языках, чем в Haskell?
Скажем, я бы хотел написать инструмент командной строки, который обрабатывает файлы, переданные в командной строке. Я бы хотел:
- Подтвердить имена файлов
- Проверить файлы доступны и читаемы
- Проверить файлы имеют допустимые заголовки
- Создать папку вывода и проверить, что выходные файлы будут доступны для записи.
- Файлы процессов, ошибки при анализе ошибок, инвариантные ошибки и т.д.
- Выходные файлы, ошибка при записи, полный диск и т.д.
Итак, довольно простой инструмент для обработки файлов.
В Haskell я бы обернул этот код в какую-то комбинацию монадов, используя Maybe и Lither, и при необходимости переведя и распространяя ошибки. В конце концов, все это доходит до монады IO, где я могу выводить статус пользователю.
На другом языке я просто бросаю исключение и улавливаю в соответствующем месте. Непосредственная. Я не трачу много времени на познавательную неопределенность, пытаясь разгадать, какую комбинацию мне нужно.
Я просто подхожу к этому неправильно или это есть какое-то вещество для этого чувства?
Редактировать: Хорошо, я получаю обратную связь, говорящую мне, что это просто тяжелее, но на самом деле это не так. Итак, вот одна больная точка. В Haskell я занимаюсь стеками монадов, и если мне приходится обрабатывать ошибки, я добавляю еще один слой в этот стек монады. Я не знаю, сколько лифта и другого синтаксического помета мне нужно было добавить, чтобы скомпилировать код, но добавляет нулевой смысловой смысл. Никто не считает, что это добавляет сложности?