我正在开发一些Clojure中的仿真软件,这些软件将需要处理大量矢量数据(基本上是作为偏移源成Java Floats的阵列,长度通常在10-10000范围内)。这些向量中的大量将需要经过各种处理步骤 - 例如使向量归一化,将两个向量流在一起,计算移动平均值等。

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

  • 允许任何向量函数变成 可插入的模块, ,例如(def module-a(make-module some函数))
  • 允许这些模块为 由管道组成, ,例如(def组合模块(组合串行模块-A模块-B))将使模块A的输出输出到模块-B的输入中
  • 允许 辅助功能 要访问在给定模块中存储的状态,例如(流动 - 平均移动平均模块),即使将某些移动平均模块嵌入到合并的管道中,也需要工作
  • 隐藏任何样板代码 在幕后,例如为矢量计算分配足够大的临时阵列。

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

如果是这样,任何实施暗示或库可能会有所帮助?

有帮助吗?

解决方案

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

解决您的每个用例:

  • 一个 Pluggagble模块 是一个clojure函数,它采用单个参数,该参数是您数据向量的状态。例如 (def module-a some-function) 为了允许模块轻松扩展,我建议使用clojure地图作为您的状态,其中一个字段是您的浮子数组。
  • 组成模块 是功能组成。例如 (def combined-module (compose module-a module-b)
  • 辅助功能 是登录机功能,从数据中提取状态。例如,如果您的数据是带有一个带有的clojure地图 :moving-average 字段,然后是关键字 :moving-average 是您的登录功能。状态不存储在模块中。
  • 样板代码 隐藏在您的函数的实现中,可以在任何地方声明,可能在另一个文件和名称空间中声明。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top