小编bkn*_*tic的帖子

更新嵌套的不可变数据结构

我想更新一个嵌套的,不可变的数据结构(我附上了一个假想游戏的一个小例子),我想知道,如果这可以做得更优雅一点.

每当地下城里的东西发生变化时,我们都需要一个新的地牢,所以我给了它一个普通的更新成员.对于一般情况,我可以提出的最佳使用方法是为每个嵌套指定处理函数,然后将组合函数传递给更新成员.

然后,对于非常常见的情况(比如将地图应用于特定级别的所有怪物),我提供了额外的成员(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# functional-programming

18
推荐指数
4
解决办法
3376
查看次数

使用F#和Silverlight的游戏:避免可变状态

我正在尝试使用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)

silverlight f#

4
推荐指数
1
解决办法
420
查看次数

标签 统计

f# ×2

functional-programming ×1

silverlight ×1