使用函数编程语言处理具有内部状态的外部库的最优雅方法是什么?

时间:2010-09-05 14:31:42

标签: scala haskell functional-programming referential-transparency

我目前正在玩Scala开发,但我需要与box2d这样的库集成来处理物理。问题是,这需要依赖于管理其自身状态的外部库。您可以跟踪传递到box2d世界的物体。总结游戏中的各个方面:

  • Box2d管理世界中的状态,并在每个滴答/步骤后修改它们
  • 您创建(使用FP)传递到此世界的实体
  • Box2d在内部修改这些实体的状态
  • 要跟踪对象,请在
  • 周围引用它们
  • 您很可能希望使用正文中的信息来呈现您的代码,因此我认为跟踪该信息的唯一方法是跟踪可变集合中的所有引用。它需要在所有帧中存活。

所以我的问题是:

如何以优雅的方式跟踪这些引用(用于函数式编程)以及如何在代码的其余部分中最小化它对纯度的影响?

状态monad的东西在这里不会帮助我,我想

2 个答案:

答案 0 :(得分:5)

实用的方法是确定哪些不变量必须为不必要的行为进行封装而不泄漏事实有副作用,然后,一旦你有证据就是这种情况,隐藏“unsafePerformIO”中的状态。

另一种方法是揭示存在内部状态的事实,例如一个明确的'我已被初始化'令牌,这是不可伪造的,不可分割的,以保证对底层资源的线性访问。

答案 1 :(得分:3)

Functional Reactive Programming是一个活跃的研究领域,但如果您不需要模拟因果关系,也可以使用Reader Monad