gpt4 book ai didi

F# 中的 Clojure 样式代理

转载 作者:行者123 更新时间:2023-12-02 14:09:38 24 4
gpt4 key购买 nike

我正在尝试使用 MailboxProcessors 在 F# 中编写一些 Clojure 风格的代理。这是我到目前为止所拥有的:

namespace GameEngine

type Agent<'T>(inital:'T) =
let mutable state:'T = inital

let queue = new MailboxProcessor<'T -> 'T>( fun inbox ->
let rec loop count =
async {
let! msg = inbox.Receive()
state <- msg(state)
return! loop(count + 1)
}
loop 0)

do
queue.Start()

member self.Send(action:'T -> 'T) =
queue.Post(action)
member self.Deref() =
state

所以基本思想是我们有一个可变状态,可以通过调用 .Send() 来更新。我的问题是,我的消息会乱序吗?如果消息 A 在 B 之前发送,上面的异步函数是否总是在 B 之前处理 A?

看起来 F# 中应该已经有这样的类了?我是在重新发明轮子吗?

最佳答案

If msg A is sent before B will the async function above always process A before B?

是的。 (您可以看到邮箱的代码

http://fsharppowerpack.codeplex.com/SourceControl/changeset/view/54799#970072

浏览到compiler\2.0\Nov2010\src\fsharp\FSharp.Core\control.fs,最终看到例如

   member x.Post(msg) =
lock syncRoot (fun () ->
arrivals.Enqueue(msg);
...

这表明它只是一个受锁的队列。)

Seems like there should be a class like this already in F#? Am I reinventing the wheel?

好吧,我并不清楚这与随意更新可变全局变量有什么不同(同时更新的模原子性;你在问题中说“之前”,所以我不清楚这方面是否重要你)。想要这个的背景是什么?

关于F# 中的 Clojure 样式代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4823456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com