2012-02-29 26 views
12

:MailboxProcessor.PostAndReply tasarım seçimi

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

ben imza benim için çok sezgilere görünüyor nedenini anlamaya olamaz. Yapmak istediğimiz, bir acenteye mesaj yollamak ve bir cevap beklemek. Neden ona 'mesaj' olarak garip bir işlev vermeliyiz?

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() 

Doğrusu böyle bir şey tercih ediyorum:

yine bu MSDN ön bilgi

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

Teşekkür

cevap

9

için gördüğünüzde Bu tür imzası oldukça kafa karıştırıcı görünüyor ilk kez ama mantıklı.


arkasındaki fikir Aradığınızda PostAndReply bunu bir fonksiyonunu vermek gerekir ki F # kütüphane tasarımı:

  • tip 'Msg bir mesaj oluşturur (gönderilmek üzere madde) F # süresinden sonra
  • (kanal) tip AsyncReplyChannel<'Reply> değerleri olarak temsil edilir, çağrıyı geri mesajlar göndermek için bir kanal oluşturur.

Eğer cevap kanalını içermesi ihtiyaçlarını inşa mesajı, ancak F # kitaplığı Mesajlarınızı (temsil etmek istiyorum nasıl bilmiyor ve bu yüzden size iletideki yanıt kanalı saklamak istediğiniz bilmiyor). Sonuç olarak, kütüphane, sistem kanalı oluşturduktan sonra aracı için mesaj oluşturacak bir işlev yazmanızı ister.

Sizin alternatif öneri
Öneriniz sorun PostAndReply, A tipi 'Msg -> 'Reply, bu aramaları sonra ajan aldığı mesaj olsaydı Receive aşağıdaki tipte olacağıdır:

'Msg * AsyncReplyChannel<'Reply> 

. .. böylece ajana gönderilen her mesajın da cevapları geri göndermek için bir kanal taşıması gerekecek. Ancak, muhtemelen alınan her mesaj için bir cevap göndermek istemezsiniz, bu gerçekten işe yaramaz. Belki böyle bir şey kullanabilirsiniz:

'Msg * option<AsyncReplyChannel<'Reply>> 

... ama bu sadece daha karmaşık oluyor (ve sadece değil hepsine 'Msg bazı mesajlara cevap, ama çünkü hala oldukça doğru değil).

+0

Tamam teşekkürler, bkz. - additionnally ajanın vücuda (> 'Msg' 'AsyncReplyChannel <'Reply>) bir AsyncReplyChannel gelen bir iletiyi oluşturur bir işlevi: Ben olsaydım, ben yapıcı içinde ek bir parametre gerektirirdi. Nitekim, bakış kullanıcı odaklı bir noktadan, insanların daha az jenerik, buna rağmen 'PostAndReply' çağrılırken bir cevap kanalından gelen bir msj oluşturmak için farklı yollar tanıtmak istiyorum neden göremiyorum. – Okay

+2

@Okay - Bu da işe yaramazdı.AsyncReplyChannel'i içeren "Msg" değerlerini yapılandırmanın farklı yollarına sahip olmak oldukça yaygındır. Örneğin, engelleme kuyruğu aracısı (bkz. MSDN http://msdn.microsoft.com/en-us/library/hh297096.aspx), her ikisi de bir yanıt kanalı taşıyan iki farklı iletiye sahiptir ve böylece iletiyi oluşturmanın iki yolu vardır . Bu, imzanın oldukça kafa karıştırıcı olduğunu kabul ediyorum. Daha okunabilir bir alternatife sahip olmak güzel olurdu, ama bunun ne olabileceğini düşünemiyorum. –