2

我正在 Clojure 中开发一些需要处理大量矢量数据的模拟软件(基本上源自 Java 浮点数组的偏移量,长度通常在 10-10000 范围内)。大量这些向量将需要经过各种处理步骤 - 例如标准化向量、将两个向量流连接在一起、计算移动平均值等。

我希望做的不是以命令式风格做所有事情,而是创建一个更具函数式风格的 Clojure 解决方案,该解决方案将执行以下操作:

  • 允许将任何向量函数转换为可插入模块,例如 (def module-a (make-module some-function))
  • 允许在管道中组合这些模块,例如 (def combine-module (combine-in-series module-a module-b)) 会将 module-a 的输出馈送到 module-b 的输入
  • 允许辅助函数访问存储在给定模块中的状态,例如(get-moving-average some-moving-average-module),即使 some-moving-average-module 嵌入到组合管道中的深处,它也需要工作
  • 在幕后隐藏任何样板代码,例如为向量计算分配足够大的临时数组。

这听起来像一个明智的方法吗?

如果是这样,任何可能有帮助的实现提示或库?

4

2 回答 2

3

在函数式语言中,一切都是数据流。您可以使用函数作为您的模块概念。

要解决您的每个用例:

  • pluggagble模块是一个 Clojure 函数,它接受一个参数,即数据向量的状态。例如(def module-a some-function) ,为了便于通过模块进行扩展,我建议使用 Clojure 映射作为您的状态,其中一个字段是您的浮点数组。
  • 组合模块就是功能组合。例如(def combined-module (compose module-a module-b)
  • 辅助函数是访问函数,从数据中提取状态。例如,如果您的数据是带有:moving-average字段的 Clojure 映射,那么关键字:moving-average就是您的访问器函数。状态不存储在模块中。
  • 样板代码隐藏在函数的实现中,可以在任何地方声明,可能在另一个文件和命名空间中。
于 2010-10-19T21:24:14.213 回答
2

结帐导管。 http://intensivesystems.net/tutorials/conduit-motive.html

于 2010-10-19T16:53:06.010 回答