Freer Monads, More Extensible Effects (2015) [pdf]
Авторы представляют рациональную реконструкцию расширяемых эффектов как альтернативы трансформерам монад. Они показывают, как свободные монады и расширяемые эффекты возникают из постепенного абстрагирования шаблонного кода при вычислениях с эффектами. Этот процесс приводит к "более свободным монадам" (freer monads), которые строятся без ограничения Functor. Продолжение в таких монадах может быть представлено эффективной выровненной по типам структурой данных, что позволяет создать библиотеку расширяемых эффектов, которая не только понятнее, но и быстрее предыдущих реализаций.
Авторы демонстрируют три удивительно простых применения: недетерминизм с обязательным выбором (LogicT), перехват исключений IO в присутствии других эффектов и полуавтоматическое управление файловыми дескрипторами через монадические регионы. Используется новый вид "ленивости", основанный на левом Kan расширении. Подход позволяет легко добавлять, комбинировать и инкапсулировать эффекты, при этом обеспечивая лучшую производительность по сравнению с MTL и другими библиотеками обработчиков эффектов.
Комментарии (17)
- Рекомендация изучить работы О. Киселёва (особенно по системам эффектов) за ясность изложения и педагогический подход.
- Упомянута библиотека
eff, но отмечено, что она не вышла в Hackage/продакшн; предложены альтернативы: Polysemy, effectful, Bluefin. - Обсуждение расширено на другие языки: Koka и Effekt (полноценные языки с нулевыми затратами на эффекты), effect-ts (самый популярный в TypeScript).
- Указано, что реализация систем эффектов требует компромисса между сложностью типов, шаблонным кодом, производительностью, обработкой высших порядков и безопасностью.
Löb and Möb: Loops in Haskell (2013)
Извините, но предоставленный вами контент неполный. Я вижу только навигационную часть GitHub, но не саму статью о LoeB-MoEB. Пожалуйста, предоставьте полный текст статьи или ее основное содержание, чтобы я мог создать точный и лаконичный пересказ на русском языке в формате Markdown, как требуется.
Комментарии (13)
- Обсуждение включает два поста на Hacker News: один от 2013 года (популярный в 2021) и другой от 2018 года.
- Функция "loeb" в Haskell полезна при написании игрушечных ассемблеров для разрешения меток в адреса.
- Монада "tardis" выполняет ту же задачу, что и "loeb", но с большим стилем.
Type Theory and Functional Programming (1999) [pdf]
Конструктивная теория типов объединяет логику и программирование в единую систему, где разработка и верификация программ происходят одновременно. Она представляет собой функциональный язык с уникальными чертами: тотальностью функций, зависимыми типами, позволяющими тип результата определять значением аргумента, а также продвинутыми модулями с логическими утверждениями в интерфейсах. Программы можно извлекать непосредственно из доказательств, что открывает возможности для автоматизированного создания корректного кода.
Книга служит введением и углублённым курсом, начиная с основ логики, λ-исчисления и функционального программирования, затем детально представляет систему теории типов с примерами. Она также критически анализирует предложения по расширению системы, такие как подавление свидетельствующей информации в подтипах или добавление коиндуктивных типов для работы с бесконечными потоками, сохраняя при этом свойства завершаемости. Практическая реализация системы помогла прояснить тонкие аспекты, например роль предположений.
Комментарии (66)
- Обсуждается перспектива широкого внедрения функционального программирования благодаря его теоретической основе, аналогично устойчивости реляционных баз данных и SQL.
- Поднимается вопрос о применении теории типов в императивных языках, с примерами из Rust и C++, где типы улучшают безопасность и выразительность.
- Высказывается критика функционального программирования как сложного и непрактичного, порождающего "ужасный код", в противовес его восприятию как более безопасного и элегантного.
- Участники делятся рекомендациями по литературе для изучения темы (TTOP, Types and Programming Languages) и отмечают её сложность, но ценность.
- Отмечается, что чистые функциональные языки непопулярны (TIOBE), но их идеи (лямбды, монады) проникают в мейнстрим (например, для асинхронного программирования).
What is algebraic about algebraic effects?
В программировании «алгебра» — это не школьные уравнения, а способ давать коду строгую структуру через свойства операций. Если обычная композиция объектов ограничивается «они реализуют один интерфейс», то алгебраическая композиция требует, чтобы набор данных и операций удовлетворял фиксированным законам: замкнутость, ассоциативность, единица, обратные элементы и т.д. Набор «целые числа + сложение» образует группу, потому что все четыре закона выполняются; код, в котором сложение строк вдруг выдаёт число, группой не является.
Именно этим объясняется «алгебраичность» Algebraic Effects: набор эффектов и обработчиков строится как свободная алгебра с заданной сигнатурой операций, а значит любая программа сводится к выражению, подчиняющемуся строгим законам переписывания. Практический выигрыш — возможность комбинировать и вложенно перехватывать эффекты без «callback-ада», потому что поведение заранее ограничено алгебраическими законами.
Комментарии (32)
- Обсуждается различие между "алгебраическими" в контексте типов данных и эффектов, подчеркивая, что последние связаны с алгеброй монад, а не просто наличием уравнений.
- Участники предлагают ресурсы для изучения темы (статья "What is algebraic about algebraic effects and handlers?") и проводят аналогии с булевой алгеброй для лучшего понимания.
- Отмечается сложность терминологии и необходимость перевода абстрактных математических концепций (операции над типами/эффектами) в более доступные для программистов термины.
- Поднимается вопрос о синтаксическом представлении алгебраических типов (сумм и произведений) в разных языках программирования (OCaml, Lean).
- Обсуждается практическое применение алгебраических операторов на примере пакета Algebra of Graphics для Julia.