Обновления в функциональном стиле - PullRequest
4 голосов
/ 05 ноября 2008

Это может быть оксюморон, но как обновить сущность данных в стиле функционального программирования? Из всего, что я читал, программирование в функциональном стиле использует преобразования для возврата вывода неизменяемых объектов. Единственное, о чем я могу думать, это полностью заменить исходную сущность, но это выглядит почти так же, как классический подход к обновлению.

Ответы [ 3 ]

6 голосов
/ 05 ноября 2008

Вы говорите об объектах дисковой базы данных или структурах данных в памяти.

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

В исходном коде clojure (написанном на Java) есть несколько действительно хороших реализаций - в своем блоге я взял две из них

http://www.loufranco.com/blog/files/20-Days-of-Clojure-Day-7.html

http://www.loufranco.com/blog/files/20-Days-of-Clojure-Day-8.html

1 голос
/ 05 ноября 2008

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

1 голос
/ 05 ноября 2008

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

Реальные интересные проблемы возникают при работе с IO, становится трудно моделировать ввод / вывод чисто функциональным образом, что приводит к обходным решениям, таким как Monads .

...