Вопрос

Я разрабатываю некоторое программное обеспечение для симуляции в Clojure, который потребуется обработать множество векторных данных (в основном происходящих в качестве смещений, в массивы плавающихся плавающих средств, длиной обычно в диапазоне 10-10000). Большое количество этих векторов необходимо пройти через различные шаги обработки - например, нормализующие векторы, объединяющие два потока векторов, вычисление скользящих средних и т. Д.

Вместо того, чтобы делать все в императивном стиле, я надеялся сделать это создание более функционального стиля Clojure Reifiece, которое сделало бы следующее:

  • Разрешить любую векторную функцию превратить в подключаемый модуль, например (def module-a (make-модуль некоторая функция))
  • Разрешить эти модули быть состоит в трубопроводах, например (DEF комбинированный модуль (модуль комбинированного ряда - модуль-б)) будет кормить вывод модуля в вход модуля-B
  • разрешать Вуксиллярные функции Для доступа к состоянию, хранящему в данном модуле, например, (Get-Moving-insive-mode-модуль среднего модуля), который должен был бы работать, даже если какой-то средний модуль встроен глубоко в комбинированном трубопроводе
  • Скрыть любой код котельной За кулисами, например, выделение достаточно больших временных массивов для векторного расчета.

Это звучит как разумный подход?

Если это так, любые подсказки или библиотеки реализации, которые могут помочь?

Это было полезно?

Решение

На функциональном языке все это DataFlow. Вы можете использовать функции в качестве концепции вашего модуля.

Для решения каждого из ваших случаев использования:

  • А. модуль PlugGagble. Это функция Clojure, которая принимает один аргумент, который является состоянием вашего вектора данных. например (def module-a some-function) Чтобы обеспечить легкое расширение модулями, я предлагаю с помощью карты Clojure в качестве состояния, где одно поле - ваш массив поплавков.
  • Сочинение модулей это функциональная композиция. например (def combined-module (compose module-a module-b)
  • Вспомогательные функции являются функциями Accessor, извлечение состояния из ваших данных. например, если ваши данные являются картой Clojure с :moving-average поле, то ключевое слово :moving-average Ваша функция аксессуаров. Состояние не хранится в модулях.
  • Котел-код Скрыт в реализации ваших функций, которые могут быть объявлены нигде, возможно, в другом файле и пространстве имен.

Другие советы

Оформить заказ кабеля.http://intensivessystems.net/tutorials/conduit-motive.html.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top