Алгебраические эффекты

Dec 21, 2024 20:32

Посмотрел несколько экспериментальных функциональных языков, которые хвастаются, что внедрили у себя алгебраические эффекты.

Эффекты эти распадаются на два случая, довольно слабо связанные друг с другом.

Во-первых, это четкое разделение функций на чистые и грязные (нечистые?). Последним прямо в тип прописывается, что они используют разные нехорошие вещи, как-то: ввод-вывод, состояние, исключения. Компилятор по этим аннотациям предположительно знает, что можно оптимизировать, а что - лучше не надо.

В принципе, довольно полезная вещь - если кто-то что-то реально оптимизирует. Ну и по крайней мере может чистую часть будет проще оттестировать, если знать, где она.

Выглядит это однозначно приятнее монад, которые, скажем честно, так и не стали популярными. Слишком они мутные, чему доказательством - десятки все новых и новых объяснений, как же они все-таки работают. А еще у них есть дефект, о котором не очень-то распинаются дилеры, заманивающие невинную молодежь. Монады отвратительно сочетаются друг с другом, и приходится поверх одного мутного слоя наворочивать второй, который еще мутнее, - монадные трансформеры.

Второй тип алгебраических эффектов, который я видел, - нечто типа try - catch, но с возможностью из обработчика исключения вернуть результат и уже с ним продолжить вычисление исходного блока дальше. Наверное, где-то это может быть полезным, но новинкой назвать сложно - потому что придумали такую фишку еще в языке PL/1 образца 1965 года. Да и в древних Бейсиках что-то такое было.

Как связаны вместе эти два варианта "эффектов" и почему они все-таки называются алгебраическими, так и осталось загадкой.

функциональное программирование, алгебраические эффекты, программирование

Previous post Next post
Up