gpt4 book ai didi

c# - 移植出队 - 添加从 C# 到 F# 的循环

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:09 24 4
gpt4 key购买 nike

我正在尝试移植这个简单的循环:

    var messages = new List<string>();
while (_MessageQueue.TryDequeue(out var message))
messages.Add(message);

其中消息队列是并发的。它用在一个模块中,该模块将来自多个线程的消息排入队列,然后由单个线程处理。

是否有惯用的 F# 方法来执行出列/添加循环?

最佳答案

F# 有几种实现并发的方法,包括对 agent-based programming 的良好支持。 ,因此您正在做的事情的惯用 F# 版本很可能不会实际使用 conrrent 队列,而是基于代理或其他一些体系结构。

但是,要回答有关循环的具体问题 - 由于巧妙地使用了 whileout var,C# 版本非常简洁。在 F# 中,您可以调用 TryDequeue 作为返回 bool 和值的方法(这样我们可以避免突变)。我会将其与递归序列表达式一起使用:

let mq = System.Collections.Concurrent.ConcurrentQueue<int>()

let rec readAll () = seq {
let succ, msg = mq.TryDequeue()
if succ then
yield msg
yield! readAll() }

let messages = readAll() |> List.ofSeq

readAll 函数定义了一个调用 TryDequeue 的序列 (IEnumerable),如果操作成功,它将消息添加到结果中,使用yield msg,然后使用 yield! 递归尝试读取更多消息。

关于c# - 移植出队 - 添加从 C# 到 F# 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984552/

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