gpt4 book ai didi

f# - MailboxProcessor.PostAndReply 设计选择

转载 作者:行者123 更新时间:2023-12-04 01:06:14 24 4
gpt4 key购买 nike

看着:

member this.PostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply

我不明白为什么签名对我来说看起来如此违反直觉。我们要做的是向代理发布消息,然后等待回复。
为什么我们必须给他一个奇怪的功能作为“信息”?

再次查看此 MSDN 片段:

let rec loop() =
printf "> "
let input = Console.ReadLine()
printThreadId("Console loop")
let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
if (reply <> "Stopping.") then
printfn "Reply: %s" reply
loop()
else
()
loop()

我宁愿喜欢这样的东西:

member this.PostAndReply : 'Msg * ?int -> 'Reply

谢谢

最佳答案

当您第一次看到这种类型签名时,它看起来很困惑,但它确实有意义。

F#库设计
背后的想法是,当您调用 PostAndReply你需要给它一个函数:

  • 构造 'Msg 类型的消息(发给代理)
  • 在 F# 运行时构建用于将消息发送回调用方的 channel 之后( channel 表示为 AsyncReplyChannel<'Reply> 类型的值)。

  • 您构建的消息需要包含回复 channel ,但 F# 库不知道您希望如何表示您的消息(因此它不知道您希望如何在消息中存储回复 channel )。因此,该库要求您编写一个函数,该函数将在系统构建 channel 后为代理构建消息。

    您的替代建议
    您的建议的问题是,如果 PostAndReply有一个类型 'Msg -> 'Reply ,代理调用 Receive后收到的消息将是以下类型:
    'Msg * AsyncReplyChannel<'Reply>

    ...因此,接收到代理的每条消息也必须携带一个用于发送回复的 channel 。但是,您可能不想为收到的每条消息都发回回复,所以这实际上行不通。也许你可以使用类似的东西:
    'Msg * option<AsyncReplyChannel<'Reply>>

    ...但这只是变得越来越复杂(它仍然不太正确,因为您只能回复来自 'Msg 的一些消息,但不能回复所有消息)。

    关于f# - MailboxProcessor.PostAndReply 设计选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501380/

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