Clojure中的可插拔矢量处理单元

时间:2010-10-19 16:08:56

标签: functional-programming clojure pipeline dataflow vector-processing

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

我希望做的是创建一个更具功能性的Clojure解决方案,而不是以命令式的方式做所有事情,而不是:

  • 允许任何矢量函数转换为可插入模块,例如(def module-a(make-module some-function))
  • 允许这些模块在管道中组合,例如(def组合模块(组合串联模块-a模块-b))将模块-a的输出馈送到module-b的输入中
  • 允许辅助功能访问存储在给定模块中的状态,例如(获得移动平均值的一些移动平均模块),即使某个移动平均模块嵌入在组合管道的深处,也需要工作
  • 在幕后隐藏任何样板代码,例如为矢量计算分配足够大的临时数组。

这听起来像是一种明智的做法吗?

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

2 个答案:

答案 0 :(得分:3)

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

解决每个用例:

  • pluggagble模块是一个Clojure函数,它接受一个参数,即数据向量的状态。例如(def module-a some-function)为了方便模块的扩展,我建议使用Clojure地图作为你的状态,其中一个字段是你的花车数组。
  • 撰写模块是功能组合。例如(def combined-module (compose module-a module-b)
  • 辅助功能是访问者功能,从数据中提取状态。例如如果您的数据是带有:moving-average字段的Clojure地图,则关键字:moving-average是您的访问者功能。状态不存储在模块中。
  • Boilerplate代码隐藏在您的函数的实现中,可以在任何地方声明,可能在另一个文件和命名空间中声明。

答案 1 :(得分:2)