这主要是关于FP的理论问题,但是我将以文字冒险(例如老式的Zork)来说明我的观点。我想知道您对如何使用FP建模有状态模拟的意见。
文字冒险似乎真的需要OOP。例如,所有“房间”都是一个Room
类的实例,您可以拥有一个基本的Item
类和接口,例如Item<Pickable>
可以携带的东西等等。
FP中的世界建模的工作原理有所不同,特别是如果您要在一个必须随着游戏的进行而不断变化的世界(对象移动,敌人被击败,得分提高,玩家改变其位置)中实施不变性的情况下。我想象一个World
拥有全部的大对象:您可以探索哪些房间,它们如何链接,玩家所携带的东西,触发了哪些杠杆。
我认为一种纯粹的方法是基本上将这个大对象传递给任何函数,然后由它们返回(可以修改)。例如,我有一个moveToRoom
获取World
并返回World.player.location
到新房间的函数,World.rooms[new_room].visited = True
依此类推。
即使这是更“正确”的方法,它也似乎在强制执行纯净。根据编程语言的不同,World
来回传递可能非常大的对象可能很昂贵。同样,每个功能可能都需要访问任何World
对象。例如,一个房间可能是可进入的还是不可进入的,这取决于另一个房间中触发的杠杆,因为它可能被淹没了,但是如果玩家携带救生衣,它仍然可以进入。怪物是否具有侵略性,取决于玩家是否在其他房间杀死了他的堂兄。这意味着该roomCanBeEntered
功能需要访问World.player.invetory
和World.rooms
,describeMonster
需要访问World.monsters
等等,(基本上,您必须传递整个负载)。在我看来,这确实需要全局变量,即使这只是良好的编程风格,尤其是在FP中。
您将如何解决这个问题?