Я не знаю правильної термінології для того, щоб задати це питання, тому я опишу це з великою кількістю слів, майте на собі.
Передумови , так що ми знаходимося на одній сторінці: Програми часто містять кеші - компроміс часу / пам'яті. Поширена помилка програміста - забути оновити кешоване значення після зміни одного з його вихідних джерел / прецедентів. Але парадигма програмування потоку даних або FRP не захищена від таких помилок. Якщо у нас є кілька чистих функцій і з'єднаємо їх разом у графіку спрямованої залежності, то у вузлів може бути кешоване їх вихідне значення та повторне використання до тих пір, поки будь-який з входів функції не зміниться. Ця архітектура системи описана в статті Caching In Environment-based-data і в загальнообов’язковій мові є більш-менш аналогічною запам'ятовуванню.
Проблема : Коли один із входів для функції змінюється, ми все одно повинні виконати функцію в цілому, викинувши її кешований вихід і перерахувавши з нуля. У багатьох випадках це здається мені марнотратним. Розглянемо простий приклад, який генерує список "топ-5, що завгодно". Вхідні дані - це несортований список будь-якого. Він передається як вхід до функції, яка видає відсортований список. Що в свою чергу є входом до функції, яка приймає лише перші 5 елементів. У псевдокоді:
input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45]
intermediate = sort(input)
final_output = substring(intermediate, 0, 5)
Складність функції сортування становить O (N log N). Але врахуйте, що цей потік використовується в додатку, де введення лише трохи змінюється за один раз, додаючи 1 елемент. Замість того, щоб переробляти з нуля кожен раз, було б швидше, власне O (N), використовувати функцію, яка оновлює старий відсортований відсортований список, вставляючи новий елемент у правильне положення. Це лише один приклад - багато функцій "з нуля" мають такі аналоги "поступового оновлення". Крім того, можливо, щойно доданий елемент навіть не з’явиться у final_output, оскільки він знаходиться після 5-ї позиції.
Моя інтуїція дозволяє припустити, що можна якось додати такі функції "поступового оновлення" до системи потоку даних, поряд з існуючими "з нуля" функціями. Звичайно, перерахунок всього з нуля повинен завжди давати той же результат, що і чимала кількість поступових оновлень. Система повинна мати властивість того, що якщо кожна з окремих примітивних пар FromScratch-Incremental завжди дає однаковий результат, то більші композитні функції, побудовані з них, також повинні автоматично давати однаковий результат.
Питання : Чи можлива наявність системи / архітектури / парадигми / мета-алгоритму, яка може підтримувати як функції FromScratch, так і їх інкрементальні аналоги, співпрацюючи за ефективністю та складаючись у великі потоки? Якщо ні, то чому? Якщо хтось уже дослідив цю парадигму і опублікував її, як вона називається, і чи можу я отримати короткий підсумок того, як вона працює?