Не видя реального кода, на самом деле трудно понять, что вы подразумеваете под неудачей. Если это чистая функция, то я не вижу, что использование Maybe
было бы проблемой. Я никогда не вижу Nothing
неудачей, но такой, какой она есть: ничего. В зависимости от контекста я либо возвращаю Nothing, либо использую значение по умолчанию и продолжаю. Я понимаю, что это можно рассматривать как провал, но это больше зависит от точки зрения
если вызывающая сторона, чем сама функция.
Теперь вы хотите представить вычисление, которое может дать сбой, но ничего не возвращает. Если это чистая функция, это не имеет смысла. Вы работаете, будучи чистым, ничего не произошло (без побочных эффектов), и вы не получите результат. Так что в случае успеха вы фактически ничего не вычислили: это не успех, это ничего. ATHI Если вы терпите неудачу, у вас есть причина, почему это не удалось. Это ничем не отличается от простой проверки, возвращающей Maybe
.
Например, вам может потребоваться проверить, что домен не находится в черном списке. Для этого вы выполняете поиск в списке. Ничто не означает, что все в порядке, хотя это означает, что это с вашей точки зрения и неудачи, и вам нужно остановить вычисления. Этот же код можно использовать для проверки того, что ваш домен входит в белый список. в этом случае ничто не является провалом: зависит только от контекста.
Теперь, если вы выполняете монадическое действие (например, сохранение файла или чего-то еще), имеет смысл ничего не возвращать, но могут произойти другие сбои (заполнение диска, неверный путь и т. Д.). Стандартная сигнатура для ввода-вывода, для которой мы не заботимся о результате, равна IO ()
, так что вы можете либо выбрать IO (Either e ())
(все это поймут), либо перейти на IO ()
и вызвать исключение (если они действительно исключительные) ).