簡體   English   中英

MailboxProcessor.PostAndReply設計選擇

[英]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 (發送給代理)
  • 在F#運行時之后構建一個用於將消息發送回調用者的通道(通道表示為AsyncReplyChannel<'Reply>類型的值)。

您構建的消息需要包含回復通道,但F#庫不知道您希望如何表示消息(因此它不知道您希望如何在消息中存儲回復通道)。 因此,庫會要求您編寫一個函數,該函數將在系統構造通道后為代理構造消息。

你的替代建議
你的建議的問題是,如果PostAndReply有一個類型'Msg -> 'Reply ,代理在調用Receive后收到的消息將是以下類型:

'Msg * AsyncReplyChannel<'Reply>

...因此,收到代理的每條消息都必須攜帶一個回復發送回復的頻道。 但是,您可能不希望為每個收到的消息發送回復,因此這不會真正起作用。 也許你可以使用類似的東西:

'Msg * option<AsyncReplyChannel<'Reply>>

...但是這變得越來越復雜(它仍然不太正確,因為你只能回復來自'Msg一些消息,但不能回復所有'Msg )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM