假设您正在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)