Я пытаюсь написать игру, используя F # и Silverlight, и немного борюсь с неизменностью.
Я хочу немного отделить игру от вида, поэтому я поместил ее в модуль и заставил ее функцию обновления возвращать новый экземпляр состояния мира, обеспечивая тем самым неизменность.
Представление (AppControl) отвечает за рисование мира.
Тем не менее, я не вижу способа превратить мир в опорную ячейку в представлении.
Теперь, я думаю, что изменяемое состояние достаточно локально, чтобы не вызывать никаких проблем (пожалуйста, исправьте меня, если я ошибаюсь), мне просто любопытно, если кто-то может придумать способ полностью избежать изменяемого состояния?
Вот схема приложения, я попытался свести проблему к сути:
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 <- world.State.ToString()
// mutating game loop
let gameLoop world =
world := Game.updateWorld !world
drawWorld !world
()
do
canvas.Children.Add(textBlock)
base.Content <- canvas
CompositionTarget.Rendering.Add (fun _ -> gameLoop world)
type App() as this =
inherit Application()
let main = new AppControl()
do this.Startup.Add(fun _ -> this.RootVisual <- main)