Чи існує загальна методика обробки стану (загалом) у функціональній мові програмування? Існують рішення в кожній (функціональній) мові програмування для управління глобальним станом, але я хочу уникати цього, наскільки я міг.
Всі стану в чисто функціональному порядку є функціональними параметрами. Тому мені потрібно поставити весь ігровий стан (гігантську хешмап зі світом, гравцями, позиціями, рахунком, активами, ворогами, ...) як параметр для всіх функцій, які хочуть маніпулювати світом за певним входом або тригером . Сама функція вибирає відповідну інформацію з ігрового блоку, робить щось з нею, маніпулює ігратом і повертає іграт. Але це виглядає як бідне рішення чоловіка для проблеми. Якщо я покладу цілі ігри на всі функції, для мене немає користі на відміну від глобальних змінних чи імперативного підходу.
Я міг би помістити у функції лише відповідну інформацію та повернути дії, які будуть вжиті за даний вхід. І одна єдина функція застосовує всі дії до gametate. Але для більшості функцій потрібно багато "відповідної" інформації. move()
потрібні положення об'єкта, швидкість руху, карта для зіткнення, положення всіх клізм, стан здоров'я, ... Тож цей підхід, схоже, не працює.
Отже, моє запитання полягає в тому, як я обробляю величезну кількість стану функціональною мовою програмування - особливо для розробки ігор?
EDIT: Існують деякі ігрові рамки для побудови ігор у Clojure. Підхід до часткового вирішення цієї проблеми полягає в тому, щоб вивести всі об’єкти в грі як "сутності" і покласти їх у величезний мішок. Гігант Основна функція тримає екран і сутності та обробки подій ( :on-key-down
, :on-init
, ...) для цього осіб і запустити головний цикл відображення. Але це не те чисте рішення, яке я шукаю.
move()
, ви, ймовірно, повинні переходити в "поточний" об'єкт (або його ідентифікатор), плюс світ, через який він рухається, і просто отримувати поточну позицію і швидкість ... вихід - це весь світ фізики, або принаймні список змінених об’єктів.