Возможные способы побочных эффектов в чисто функциональных языках - PullRequest
2 голосов
/ 29 декабря 2011

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

Я знаю о типах монад (Haskell) и уникальности (Clean).Есть ли другие возможности?

Ответы [ 3 ]

6 голосов
/ 29 декабря 2011

В Меркурий по умолчанию все чисто (даже IO), и невозможно написать нечистый код без использования редко необходимых функций.

Чистый IO обрабатывается аналогичноЧистота (я полагаю), используя уникальность и параметр состояния мира.Однако Mercury считает уникальность свойством mode , а не свойством типа.(«Режим» в этом контексте является более или менее направлением потока данных)

Но у Меркурия также есть система статической чистоты.Некоторый код распознается компилятором как impure (вызовы интерфейса на иностранном языке или известных нечистых функций / предикатов, доступ к изменяемым переменным и несколько других случаев).Такой код должен быть явно объявлен impure, или это ошибка компилятора.Поскольку компилятор знает о нечистоте, он не выполняет переупорядочения или другие оптимизации, которые могут повлиять на нечистый код.Если на каком-то уровне вы можете обеспечить чистый интерфейс вокруг нечистых операций, вы можете пообещать компилятору, что функция / предикат на самом деле является чистой.В противном случае требуемые декларации примесей распространяются вплоть до предиката main;если вы готовы сделать это, вы могли бы по сути программировать на Меркурии (хотя это было бы не очень весело).

У Меркурия также есть концепция semipure кода.Это код, который не имеет побочного эффекта при работе любого другого полупрозрачного или нечистого кода (чистый код по определению не подвержен побочным эффектам любого другого кода), но может подвергаться влиянию побочных эффектов от другихнечистый код.Этот дополнительный уровень информации означает, что компилятор может гораздо более свободно оптимизировать вызовы, которые не являются чистыми только потому, что они «видят» побочные эффекты, но сами по себе их не имеют;они могут быть оптимизированы, если их результаты не нужны, и они могут быть переупорядочены до тех пор, пока они не перемещены «поверх» вызова impure.

2 голосов
/ 29 декабря 2011

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

Другая существующая парадигма - это функционально-реактивное программирование. FRP вводит специальный тип значения, называемый поведение , значение которого отражает текущее значение некоторого объекта в «реальном мире» (будь то файл на диске, положение мыши и т. Д.). Поведение ввода может быть функционально объединено друг с другом для создания поведения вывода, которое используется реализацией для обновления вещей в «реальном мире» (например, содержимое дисплея). Большинство реализаций FRP также вводят второй специальный тип значения, называемый event , который эквивалентен поведению, которое имеет значение только в отдельные моменты времени (например, нажатия клавиш или щелчки мыши), и предоставляет библиотечные функции для сочетания поведения и событий полезными способами (наиболее важно «запомнить» значение поведения в определенный момент в прошлом, когда произошло какое-либо событие).

2 голосов
/ 29 декабря 2011

Язык программирования D имеет строго чистые функции и слабо чистые функции.Сильно чистые функции во многом схожи с тем, что вы получаете в Haskell.Слабо чистая функция, с другой стороны, может изменять свои аргументы, но они не могут изменять глобальное состояние.Идея состоит в том, что pure - это то же самое, что и : приватное состояние функции расширяется, чтобы разрешить функциям, которые могут изменять свое приватное состояние без изменения глобального состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...