← На главную

Algebraic Effects: try/catch с возвратом уже в React Suspense

26.05.2026 17:38 · hackernews

Алгебраические эффекты (Algebraic Effects) — исследовательская фича языков программирования. Они пока не добрались до продакшена, но кое-где зреют (OCaml, LISP). Идея проста: это как try/catch, только можно не просто поймать исключение, а вернуться обратно в код и продолжить.

В обычном try/catch, если функция выбросила ошибку, исполнение останавливается. В алгебраических эффектах вместо throw используется perform, а вместо catchhandle с ключевым словом resume with. Выполнение прыгает в обработчик, тот что-то делает и возвращает значение обратно в то место, откуда был вызван perform. То есть код внутри try может «приостановиться», спросить внешний мир, получить ответ и продолжить.

Это ломает «цвет» функций в async/await. В JavaScript, если сделать функцию асинхронной, её приходится всюду помечать async. С алгебраическими эффектами промежуточные функции ничего не знают об эффекте — обработчик сидит где-то выше в стеке вызовов. Можно даже resume with вызывать асинхронно (через setTimeout), и код внутри try не меняется.

React активно на это смотрит. Suspense внутри бросает Promise — React ловит его и перерисовывает компонент, когда Promise разрешится. Это не настоящий алгебраический эффект, но идея та же: код внизу «приостанавливается», а React наверху решает, что делать. Hooks (useState) можно мысленно представить как эффект perform State(), который обрабатывается React'ом при вызове компонента. На самом деле React хранит текущий диспатчер в скрытом поле — это «грязная» эмуляция эффектов, но работает.

Алгебраические эффекты отделяют «что» от «как» — пишете логику, а обработчики эффектов (логирование, файловая система, тесты) подключаются снаружи без изменения кода. Они мощные, но, возможно, слишком мощные для JavaScript. Впрочем, если они появятся в мейнстриме к 2025 году, автор будет рад.

Читать оригинал →