FsToolkit.ErrorHandling provides the standard infix operators for map (<!>), apply (<*>), and bind (>>=) to work with Result<'a, 'b list>.
There are also variants of the map and apply operators (<!^> and <*^>) that accept Result<'a, 'b> (non-list) as the right-hand argument.
Examples
Example 1
Assume that we have following types and functions:
typeLatitude=private Latitude offloatwith// float -> Async<Result<Latitude, string list>>static member TryCreate (lat :float)=// ...typeLongitude=private Longitude offloatwith// float -> Async<Result<Longitude, string list>>static member TryCreate (lng :float)=// ...typeTweet=private Tweet ofstringwith// string -> Async<Result<Tweet, string list>>static member TryCreate (tweet :string)=// ...// Latitude -> Longitude -> Tweet -> CreatePostRequestlet createPostRequest lat long tweet =// ...
We can make use of the standard operators in the AsyncValidation Operators module to perform the asyncValidation of the incoming request and capture all the errors as shown below:
By using the AsyncValidation operators instead of the Result operators, we collect all the errors:
validateCreatePostRequest 300.400.""// Error["300.0 is a invalid latitude value""400.0 is a invalid longitude value""Tweet shouldn't be empty"]
Example 2
In the above example, all the TryCreate functions return a string list as the error type (Async<Result<'a, string list>>). If these functions instead returned Async<Result<'a, string>> (only a single error), we can use <*^> and <!^> to get the same result: