相关疑难解决方法(0)

维持Haskell中的复杂状态

假设您正在Haskell中构建一个相当大的模拟.有许多不同类型的实体,其属性随着模拟的进行而更新.让我们说,为了举例,您的实体被称为猴子,大象,熊等.

维护这些实体状态的首选方法是什么?

我想到的第一个也是最明显的方法是:

mainLoop :: [Monkey] -> [Elephant] -> [Bear] -> String
mainLoop monkeys elephants bears =
  let monkeys'   = updateMonkeys   monkeys
      elephants' = updateElephants elephants
      bears'     = updateBears     bears
  in
    if shouldExit monkeys elephants bears then "Done" else
      mainLoop monkeys' elephants' bears'
Run Code Online (Sandbox Code Playgroud)

mainLoop函数签名中明确提到的每种类型的实体已经很难看了.你可以想象,如果你有20种类型的实体,它会变得非常糟糕.(20对于复杂的模拟来说并非不合理.)所以我认为这是一种不可接受的方法.但它的优点在于它们的功能updateMonkeys非常明确:它们会获取Monkeys列表并返回一个新的.

那么接下来的想法是将所有内容都卷成一个包含所有状态的大数据结构,从而清理以下签名mainLoop:

mainLoop :: GameState -> String
mainLoop gs0 =
  let gs1 = updateMonkeys   gs0
      gs2 = updateElephants gs1
      gs3 = updateBears     gs2
  in
    if shouldExit gs0 then "Done" else
      mainLoop …
Run Code Online (Sandbox Code Playgroud)

state haskell functional-programming

59
推荐指数
1
解决办法
4106
查看次数

标签 统计

functional-programming ×1

haskell ×1

state ×1