看一下:
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
感谢
AsyncReplyChannel<'Reply> -> 'Msg
)构造消息的函数,除了代理的主体之外。实际上,从用户中心的角度来看,我不明白为什么人们希望引入不同的方式从回复通道构造消息,当调用PostAndReply
时,虽然它会更少见。 - OkayAsyncReplyChannel
的'Msg
值的方式有很多种。例如,阻塞队列代理(请参见MSDN http://msdn.microsoft.com/en-us/library/hh297096.aspx)有两个不同的消息都携带回复通道,因此您有两种构造消息的方式。话虽如此,我同意签名非常令人困惑。拥有更易读的替代方案会很好,但我无法想出可能的解决方案... - Tomas Petricek