Какова философия «функционального программирования», когда вы действительно хотите создать побочный эффект? - PullRequest
0 голосов
/ 28 мая 2018

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

function (a,b) {
    return a + b;
}

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

Но как я могу сделать «чистые функции», как я могу оставаться в парадигме «функционального программирования», когда я действительно хочу создать побочный эффект, такой как изменение текстового содержимого вDOM, например:

function changeContent () {
   let content = document.querySelector("#content");
   content.textContent = 'Hello World';
}

Эта функция имеет побочный эффект, она не получает входной сигнал, а возвращает побочный эффект, она создает побочный эффект, но на самом деле это и есть точка функции.Это все еще "функциональное программирование"?Как в таком случае оставаться в парадигме «функционального программирования»?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

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

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

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

  • Жертвоприношение чистоты.Просто напишите функцию с побочным эффектом.Тщательно документируйте это, чтобы все, кто использует эту функцию, знали об этом.По-разному рассуждайте об обязательных частях вашей программы.

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

  • Создайте (чистую) структуру данных, которая явно описывает эффекты, которые вы хотите, чтобы ваша программа имела.Затем имейте нечистый «интерпретатор», который выполняет их, чтобы «запустить» вашу программу.(Я не буду здесь вдаваться в подробности, как могла бы работать такая структура данных, существуют разные подходы, и объяснение выходит за рамки вопроса).

    В Haskell, который обеспечивает чистоту всех функций,эта структура данных является типом IO, который в основном описывает императивное вычисление, и интерпретатор для него встроен во время выполнения.

В JavaScript такого интерпретатора нет.Вы можете создать его самостоятельно (или использовать библиотеку, созданную для этой цели), но в конечном итоге вам нужно вызвать функцию run где-то в вашей программе, которая возвращает вас к # 1.

Специально для DOM:структура данных для описания изменений в документе будет относительно легко построить.Вы могли бы даже ввести чисто функциональные оптимизации, которые, например, позволили бы избежать многократной записи в одно и то же местоположение или в местоположения, которые впоследствии все равно будут удалены.

Однако DOM является фундаментальной частью асинхронного характера JavaScript.Трудно описать потенциально одновременное взаимодействие с событиями входов и выходов.

0 голосов
/ 28 мая 2018

Я не уверен, что это полезно, но вы можете передать DOM-контент в функцию и в результате получить новый.как это:

function changeContent(content, value) {
    let result = deepcopy(content);       //copy the passed object to preserve it from modifying
    result.textContent = value; //change smth in copied object
    return result;
}

deepcopy - это функция, которая возвращает копию объекта (если вы установите непосредственно результат = содержимое, то изменение некоторых значений в объекте результата также приведет к изменению значений в объекте содержимого). ПРИМЕЧАНИЕ : Deepcopy не является встроенной функцией, вы должны написать ее самостоятельно или использовать библиотеку.

PS Если этот ответ не поможет, вы можете прочитатьстатья о функциональном программировании здесь

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