【发布时间】:2011-08-23 11:31:04
【问题描述】:
假设我有一堆标记为 A-Z 的组件...我首先向每个组件发送一个 1.0 的值,每个组件返回一个双精度值(比如 a_0、b_0、..、z_0)。下一次迭代我将总和 (1.0 + a_0 + ... + z_0) 发送到每个组件,以获得 26 个新的双精度数 (a_1,...,z_1) 和一个新值 (1.0 + a_0 + ... +z_0 + ... + a_1 + ... + z_1)。计算每天都以这种方式继续。
问题在于每个组件本身都是递归的,并且依赖于前几天的 20 个左右的值。因此,最明显的递归实现变得混乱,因为组件计算的每个独立路径都有大量冗余递归调用。
在我当前的实现中,我将组件分成多个代理,他们负责自己的状态并使用消息传递来完成计算。我现在需要对我的模型进行更改,但我发现这种实现并不灵活。
我的新想法是使用不可变对象来保存组件的状态,每次迭代我都会克隆我的组件对象并使用区分联合更新状态。即
Component(oldcomponent, [Parameter1(22.0), Parameter14(10.0)])
将有状态 oldcomponent 但更新参数 1 和 14。因此,由于大多数路径仅更新少数参数,因此组件计算的每个路径都易于阅读。作为奖励,我可以将计算分成一系列函数,这些函数将突变列表作为输入并输出新的突变列表。
但是,我觉得这个问题非常适合函数式语言,我有点偏离函数式设计,这很好,但我很好奇其他人会如何解决这个问题?
编辑:
我认为当我可以使用带有“with 语法”的记录来传递它时,区分联合方面是没有意义的。
【问题讨论】:
-
基于代理的消息传递风格对我来说看起来不错 - 所以当然它很好的设计来传递 20-values arround - 为什么不呢?
-
我将重新考虑基于代理的方法,我现在需要对我的模型进行更改,这涉及使用分布在多个代理中的参数,我觉得实现此更改比它应该的更复杂是...就传递大约 20 个参数而言,当涉及到使用我的模型时,当我需要添加一两个参数并且我发现我自己更新了六个递归调用来解决它时,它开始感到多余.
-
我认为查看您的代码会有所帮助。
标签: f#