voy a añadir solamente que la notación do!
no tiene que ser apoyado explícitamente por la expresión de cálculo, porque lo mismo se puede escribir usando let!
así:
do! foo() // Using do!
let! _ = foo() // Equivalent using let!
En general let!
nosotros utilizamos cuando tiene alguna función implementada usando expresiones de cálculo y quiere llamarla desde otra expresión de cálculo del mismo tipo. Esto significa que se usa para componer expresiones de cálculo. Para async
, esta composición significa que tiene un código asincrónico sin bloqueo y lo llama de otro flujo de trabajo asíncrono de alguna manera especial para que la llamada sea asincrónica.
La palabra clave let!
le permite hacer esto y obtener algún valor como resultado, mientras que do!
es un acceso directo que puede usar si el cálculo no devuelve nada.
un capítulo de la programación funcional del mundo real que trata sobre las expresiones de cálculo (y también las expresiones de secuencia) está disponible como una muestra gratis, así que si quieres leer un tutorial más detallado sobre expresiones de cálculo esto puede ser una buena fuente de infromation:
por cierto: debe ser posible escribir el código de ejemplo en su pregunta de una manera más agradable el uso de la primitiva AwaitEvent
así:
async {
let! _ = this.Loaded |> Async.AwaitEvent
do! Async.Sleep 200
for cmd in theDrawing do
do! this.Execute(cmd) } |> Async.StartImmediate
Esto significa la misma cosa - que espera primero hasta que se produzca el evento Loaded
, entonces se espera 200ms y luego lo hace el resto del trabajo. Este espera es especial (es por eso que usamos let!
/do!
, porque no bloquea el hilo mientras espera).
¿Hay un nombre para esta notación? ¿Dónde leer más al respecto? –
"expresiones de cálculo" o "flujos de trabajo"; una explicación antigua (algo desactualizada) está aquí: http://blogs.msdn.com/dsyme/archive/2007/09/22/some-details-on-f-computation-expressions-aka-monadic-or-workflow- syntax.aspx – Brian
Un capítulo de la Programación funcional del mundo real que trata expresiones de cálculo (y también expresiones de secuencia) está disponible como un capítulo de muestra gratis: http://www.manning.com/petricek/SampleChapter12.pdf –