小编Ric*_*ton的帖子

使用MailboxProcessor的通用查询和命令

我认为这个问题涉及同一领域,但我看不出它如何适用于我的情况. 来自代理/邮箱处理器的通用回复?

这是背景.我有一些状态,现在我只想说它只包含一个玩家列表.可能会有更多,例如游戏等.我也有一个没有玩家的initialState.

type Player = {Name: string; Points: int}
type State = {Players: Player list}
let initialState = {Players = []}
Run Code Online (Sandbox Code Playgroud)

我有两种需要处理的"消息".查询,是将状态映射到某个值但不更改状态的函数.例如,返回显示最高得分的int.

和生成新状态的命令,但可以返回值.例如,将新玩家添加到集合中,并返回id或其他内容.

type Message<'T> =
| Query of (State -> 'T)
| Command of (State -> 'T * State)
Run Code Online (Sandbox Code Playgroud)

然后我们有一个可以响应消息的模型.但不幸的是,它使用了一个可变状态,我更喜欢使用MailboxProcessor和消息循环.

type Model(state: State) =
  let mutable currentState = state

  let HandleMessage (m: Message<'outp>) =
    match m with
    | Query q -> q currentState
    | Command c ->
        let n, s = c currentState
        currentState <- s
        n

  member …
Run Code Online (Sandbox Code Playgroud)

f#

8
推荐指数
1
解决办法
277
查看次数

标签 统计

f# ×1