Errors are values – древняя статья в официальном блоге Go о том, как сократить число проверок if err != nil
, сделав код чище и быстрее.
Этот подход используется, например, в свежем пакете script, позволяющем писать красивые пайплайны для работы с системными процессами из Go (вызов команд и процессинг данных): команды выстраиваются в цепочку вызовов, и если ошибка возникается где-то в середине, оставшиеся команды просто не вызываются, а просто пробрасывают ошибку дальше.
Rob Pike Reinvented Monads – статья о том, что описанный механизм отлично реализуется через монады. Вот только на языке, имеющем встроенную поддержку монад, всё то же самое делается гораздо проще. Именно с этой статьи и началось моё путешествие в мир Haskell. Посмотрим, что из этого выйдет.
goderive – библиотека для функционального программирования в Go. Так как Go строготипизированный и без дженериков, то работает это всё через кодогенерацию (можно сказать, классический подход в Go). Конкретно описанный выше подход с пробрасыванием ошибок через цепочку вызовов реализуется с помощью deriveDo.
Вообще, Go с монадами и вообще всевозможными фичами, уже есть, и называется Rust. Вот только туда столько всего завезли, и всевозможные функции, и всякие разные виды строк, что это стало излишне сложным, а Go любят за простоту, понятность, низкий порог вхождения. Так что подобные библиотеки вызывают неоднозначное впечатление.