[英]MailboxProcessor.PostAndReply design choice
看着:
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
類型'Msg
(發送給代理) AsyncReplyChannel<'Reply>
類型的值)。 您構建的消息需要包含回復通道,但F#庫不知道您希望如何表示消息(因此它不知道您希望如何在消息中存儲回復通道)。 因此,庫會要求您編寫一個函數,該函數將在系統構造通道后為代理構造消息。
你的替代建議
你的建議的問題是,如果PostAndReply
有一個類型'Msg -> 'Reply
,代理在調用Receive
后收到的消息將是以下類型:
'Msg * AsyncReplyChannel<'Reply>
...因此,收到代理的每條消息都必須攜帶一個回復發送回復的頻道。 但是,您可能不希望為每個收到的消息發送回復,因此這不會真正起作用。 也許你可以使用類似的東西:
'Msg * option<AsyncReplyChannel<'Reply>>
...但是這變得越來越復雜(它仍然不太正確,因為你只能回復來自'Msg
一些消息,但不能回復所有'Msg
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.