2008-11-05 21 views
4

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

ответ

6

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

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

Есть некоторые действительно хорошие реализации, чтобы смотреть на в источнике 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

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

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

1

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