我想更新一个嵌套的,不可变的数据结构(我附上了一个假想游戏的一个小例子),我想知道,如果这可以做得更优雅一点.
每当地下城里的东西发生变化时,我们都需要一个新的地牢,所以我给了它一个普通的更新成员.对于一般情况,我可以提出的最佳使用方法是为每个嵌套指定处理函数,然后将组合函数传递给更新成员.
然后,对于非常常见的情况(比如将地图应用于特定级别的所有怪物),我提供了额外的成员(Dungeon.MapMonstersOnLevel).
整个事情都有效,我想知道,如果有人能想到更好的方法.
谢谢!
// types
type Monster(awake : bool) =
member this.Awake = awake
type Room(locked : bool, monsters : Monster list) =
member this.Locked = locked
member this.Monsters = monsters
type Level(illumination : int, rooms : Room list) =
member this.Illumination = illumination
member this.Rooms = rooms
type Dungeon(levels : Level list) =
member this.Levels = levels
member this.Update levelFunc =
new Dungeon(this.Levels |> levelFunc)
member this.MapMonstersOnLevel (f : Monster -> Monster) nLevel =
let monsterFunc = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用F#和Silverlight编写游戏,并且在不变性方面有点挣扎.
我想将游戏与视图分离一点,所以我将它放在一个模块中并使其更新函数返回一个新的世界状态实例,从而提供不变性.
视图(AppControl)负责绘制世界.
但是,我认为没有办法让世界成为视图中的ref单元格.
现在,我认为可变状态是本地的,不会引起任何问题(请纠正我,如果我错了),我只是好奇,如果有人能想到一种完全避免可变状态的方法吗?
这是应用程序的大纲,我试图将问题简化为本质:
open System
open System.Windows
open System.Windows.Controls
open System.Windows.Media
module Game =
type World = { State : int }
let init() =
{ State = 0 }
// immutable update loop
let updateWorld world =
{ State = world.State + 1 }
type AppControl() =
inherit UserControl()
let canvas = new Canvas()
let textBlock = new TextBlock()
let world = Game.init() |> ref // mutable world
let drawWorld (world : Game.World) =
textBlock.Text <- …Run Code Online (Sandbox Code Playgroud)