Async computation expressions and >=>
Suave WebParts use F# async computation expressions. For example you could write a time wasting WebPart like this:
Async computation expressions are built into the F# language as a way of chaining asynchronous functions together. As well as
return! you can use
let! to wait for another async function to return and then assign the result to a variable. For instance,
let! result = anotherAsyncWorkflow. Behind the scenes “let!” is just syntactic sugar for calling the method
builder.Bind on a computation builder.
In Suave we program by chaining functions of type WebPart.
Suave uses the
>=> operator to chain WebParts together. In category theory this operation is known as a Kleisli composition. That is to say,
chains together Async options rather than just vanilla Async computations. If the result of the first of the two chained workflows is
None, then the computation is short-circuited and the second computation is never run. If the first computation returns
Some x, then
>=> behaves in much the same way as
let!: the result of running the expression on the left is passed into the expression on the right.
There is a good tutorial on using the
>=> operator to short circuit a series of operations here: Railway oriented programming
There is also a good tutorial on computation expressions by the same author: Computation expressions: Introduction