2011-08-01 21 views
5

arasındaki fark böyle bir şey yazmaya arasında bir fark var mı:F # async - iki yapının

MailboxProcessor.Start(fun inbox -> async { 
    let rec loop bugs = 
     let! msg = inbox.Receive() 
     let res = //something 
     loop res 
    loop []}) 

Ve böyle yazıyorum:

MailboxProcessor.Start(fun inbox -> 
    let rec loop bugs = async { 
     let! msg = inbox.Receive() 
     let res = //something 
     do! loop res } 
    loop []) 

teşekkürler!

cevap

7

İlk örnek geçerli F # kodu değil, çünkü let! yalnızca hesaplama ifadesinin hemen içinde kullanılabilir. Örneğinizde, onu sıradan bir işlevde kullanıyorsunuz - gövdesi bir hesaplama ifadesi değil, bu nedenle let! bu konumda izin verilmiyor. - o zaman sadece kullanmak gerekir

MailboxProcessor.Start(fun inbox -> async { 
    let rec loop bugs = async { 
     let! msg = inbox.Receive() 
     let res = //something 
     return! loop res } 
    return! loop []}) 

Siz de snippet'te dış async { .. } blok tutabilir:

Eğer async içindeki loop fonksiyonun gövdesini sarmak gerekirdi de geçerli kılmak için return!, loop işlevini çağırmak yerine, yalnızca döndürmek yerine (ancak bunun dışında önemli bir fark yoktur). I return! yerine do! kullanılan

Not - return! akımı vücudun geri kalan iptal edilebilir, yani bir kuyruk-çağrı temsil ettiği bu aslında, bir farktır. do! kullanırsanız, async yığınta bir yığın çerçevesi gibi bir şey ayırır, bu nedenle özyinelemeli döngü işlevinde do! kullanılması belleği sızdırıyor.

+2

Yardım edemiyorum ama neden işe yarayıp başlamadığını neden görmediklerini merak ediyorum. – ChaosPandion

+1

Ve işte eve döndüğümde, tüm uygulamalarımın sanal bellekten çıkıp sistemimle düştüğünü merak ettim! Teşekkürler Tomas! –

+0

@ChaosPandion Çok iyi bir nokta, başka bir nedenden dolayı derleme yapmayan bir kodla oynuyordum ve baktığım şeyin işe yarayacağını düşünmekteyim - soruyu oylamakta özgürsünüz ama Tomas'ın cevabı zaten oldukça yararlıydı. –