Я разрабатываю некоторое программное обеспечение для моделирования в Clojure, которое должно будет обрабатывать множество векторных данных (в основном возникающих в виде смещений в массивы с плавающей запятой Java, длина которых обычно находится в диапазоне 10-10000). Большое количество этих векторов должно будет пройти через различные этапы обработки, например. нормализация векторов, объединение двух потоков векторов, вычисление скользящего среднего и т. д.
Вместо того, чтобы делать все в императивном стиле, я надеялся создать более функциональное решение Clojure, которое будет делать следующее:
- позволяет превратить любую векторную функцию в подключаемый модуль, например. (def module-a (сделать-модуль какой-то функцией))
- позволить этим модулям быть компонованными в конвейеры, например. (def Combined-Module (combine-in-series module-a module-b)) будет подавать вывод модуля-a на вход модуля-b.
- разрешить вспомогательным функциям доступ к состоянию, хранящемуся в заданном модуле, например (get-moving-average some-moving-average-module), который должен работать, даже если модуль some-moving-average встроен глубоко в комбинированный конвейер.
- скрыть любой шаблонный код за кулисами, например выделение достаточно больших временных массивов для расчета векторов.
Звучит ли это как разумный подход?
Если да, то какие-нибудь подсказки по реализации или библиотеки, которые могут помочь?