Комментарии 12
Ух ты, заново изобретены цепочки промисов, но синхронные и замысловатые. Хотя казалось бы, никто не мешает сделать
Promise.resolve().then(...).then(...)....catch(e=>...);
Ну правда результат получится упакован в промис
Интуитивно кажется, что изобретатели промисов имели в виду эти цепочки, делая свои. То есть промисы это что-то вроде этой монады, но асинхронное.
А потом придумали async & await, чтобы вернуть обработку ошибок обратно к try & catch.
А в какой момент простая функция превратилась в монаду? :)
А если серьёзно, то именно для обработки ошибок все эти left, right, map напрягают. Есть ссылка на какой-то алгебраический стандарт, но непонятно неподготовленному читателю причём тут алгебра вообще. Кажется, что лучше бы зашло использование "нативных" для обработки ошибок имён, а уж в конце рассказать о этой алгебре и стандартах и привести к ним. Да и в целом непонятно можно ли сделать left success путём, а right — fail. Как-то в итоговом either логичнее бы смотрелось showError на втором месте: обычно нас интересует success путь прежде всего при чтении кода.
Кроме того, исключения загрязняют код. Мы не будем здесь подробно обсуждать функциональную чистоту. Но давайте рассмотрим один маленький аспект функциональной чистоты: ссылочную прозрачность. Ссылочно-прозрачная функция всегда возвращает один и тот же результат для конкретного входа. Но для функций с исключениями мы не можем такого сказать. В любой момент они могут выдать исключение вместо возврата значения. Это усложняет логику.
Подмена понятий, имхо: поведение функции может не зависеть от внешнего состояния и она может выдавать исключения. Это тоже можно считать результатом, а не побочным эффектом. Для конкретного входа всегда один и тот же результат, нарушений ссылочной прозрачности я не вижу.
Возможно, тут автору не нравится, что обработка исключений скрыта (как говорится в конце статьи) и на самом деле подразумевается "легко забыть обработку, потому что непонятно, нужна ли она".
Жутко. Интересно. Жутко интересно. Но на описании .ap(), мозг отказался дальше воспринимать. Надо попробовать через денёк вернуться. :)
Та не, какая то каша получилась, автор взял да слил в одну лужу концепции Either и Railway Oriented Programming. В конце концов получилось что то нелепое. В RoP конечный продукт это продвинутая композиция функций а не непонятно что:
let process = step1 >>= step2 >>= step3
Элегантная обработка ошибок в JavaScript с помощью монады Either