Шаблоны пользовательского интерфейса на функциональных языках

11

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

Позвольте мне привести пару примеров. Я имею в виду приложения, которые запускаются в браузере, но я думаю, что проблема более общая. Конечно, что-то изменится - по крайней мере, DOM. Но я хотел бы узнать, как организовать оставшуюся часть кода для работы с неизменяемыми структурами данных.

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

2) Скажите, что я проектирую модуль автозаполнения для поля ввода. Каждый раз, когда пользователь нажимает клавишу, я могу позвонить на сервер, чтобы получить предложения. Это легко. Но теперь предположим, что я хочу немного его оптимизировать. Если я знаю, что все результаты совпадают, fooнет смысла снова запрашивать совпадения всех результатов foobar; Я могу просто отфильтровать первое. Поэтому мне нужно построить какой-то кеш. Этот кэш будет обновляться каждый раз, когда пользователь вводит новое слово, которое не является надмножеством ранее введенных слов. Опять же: как мне смоделировать кеш? Наиболее разумный способ, по-видимому, заключается в отображении хеш-таблицы в слова, но она должна быть изменчивой.

Можете ли вы предложить некоторые шаблоны, которые облегчили бы включение изменений из-за взаимодействия с пользователем в функциональный дизайн?

Andrea
источник
4
Поиск "Функциональное реактивное программирование".
dan_waterworth
Это не совсем то же самое, но с (без побочных эффектов) шаблонами XSLT, которые соответствуют событиям DOM, инициированным пользователем, мы сталкиваемся с подобной проблемой в Saxon-CE. Мне нравится видеть, что пользователь вызывает изменение состояния, а не XSLT, так что это нормально. Ключ должен гарантировать, что код, который управляет взаимодействием с пользователем и последующими изменениями в состоянии, очень отделен от остальных.
pgfearo
@pgfearo У вас есть какой-нибудь совет, как организовать код так, чтобы взаимодействие с пользователем было достаточно отдельным от остальных?
Андреа
Нет хорошего способа справиться с изменениями состояния, когда вы работаете функционально, так как функциональное программирование не имеет состояния.
Старый Pro
3
@ Old Pro: это не совсем правильно. В то время как в функциональном программировании вы определяете вычисление, используя функциональное приложение вместо побочного эффекта, в конечном итоге вы должны где-то сохранить результат вычисления. Основное внимание в FP уделяется ограничению использования состояния до минимума, тогда как в императивном программировании постепенное преобразование состояния (с помощью побочных эффектов) является основным инструментом для определения вычислений.
Джорджио

Ответы:

3

Как упоминалось в комментариях, вам следует поискать «Функциональное реактивное программирование», а также прочитать некоторые посты по адресу http://prog21.dadgum.com/archives.html . В частности, вам следует прочитать « Не влюбляйтесь в свою технологию », « Пишите код, как вы только что узнали, как программировать », « Функциональное программирование не работает (и что с этим делать) », и, возможно, несколько других.

Полностью избежать изменчивости и побочных эффектов практически невозможно. Даже программисты на Haskell время от времени используют unsafePerformIOдля выхода из чисто функциональной парадигмы статический тип без побочных эффектов. Если вы начинаете этот проект как чисто академическое упражнение, тогда идите вперёд и по возможности избегайте изменчивости и побочных эффектов, но если вы пытаетесь создать пригодный для использования продукт в сжатые сроки, то никакой шаблон вас не спасет.

davidk01
источник