Есть вот такой код.
функция view каждый раз возвращает новый элемент управления, т.к. чистая.
Получается ФП не работает с Winforms? Нужны элементы ООП, чтобы избежать дикого оверхеда?
open System
open System.Windows.Forms
type Update<'Msg, 'Model> = 'Msg -> 'Model -> 'Model
type Dispatch<'Msg> = 'Msg -> obj -> EventArgs -> unit
type View<'Model, 'Msg> = 'Model -> Dispatch<'Msg> -> Control
type Program<'Model, 'Msg>(initialModel: 'Model, view: View<'Model, 'Msg>, update: Update<'Msg, 'Model>) =
let pump = Event<'Msg * 'Model>()
let evt = pump.Publish
let dispatch model msg _ _ = pump.Trigger(msg, model)
let form = new Form(Text = "OK")
do
evt.Add(fun (msg, model) ->
let newModel = update msg model
let newLayout = view newModel (dispatch newModel)
form.Controls.Clear()
form.Controls.Add(newLayout))
member __.Run() =
let initialLayout = view initialModel (dispatch initialModel)
form.Controls.Add(initialLayout)
form.ShowDialog()
type Model = int
let initialModel: Model = 0
type Msg =
| Increment
| Decrement
let update msg model =
match msg with
| Increment -> model + 1
| Decrement -> model - 1
let view model dispatch =
let clickCount = new Label(Text = sprintf "Clicked %d times" model)
let incrButton = new Button(Text = "+")
let incrClickHandler = EventHandler(dispatch Increment)
incrButton.Click.AddHandler(incrClickHandler)
let decrButton = new Button(Text = "-")
let decrClickHandler = EventHandler(dispatch Decrement)
decrButton.Click.AddHandler(decrClickHandler)
let layout = new FlowLayoutPanel(Dock = DockStyle.Fill)
layout.Controls.Add(clickCount)
layout.Controls.Add(incrButton)
layout.Controls.Add(decrButton)
layout :> Control
let runProgram model view update =
let main = Program(model, view, update)
main.Run()
runProgram initialModel view update