Namespace: FsToolkit.ErrorHandling
Function Signature:
('input -> CancellableTaskValidation<'output, 'Error>)
-> CancellableTaskValidation<'input, 'Error>
-> CancellableTaskValidation<'output, 'Error>Chains two CancellableTaskValidation computations using monadic (short-circuit) semantics. If the first computation returns an Error, the binder function is not called and the error is propagated immediately.
Note: Unlike apply or map2, bind does not accumulate multiple errors — it short-circuits on the first failure. For error accumulation, use the applicative operators or the cancellableTaskValidation CE with and!.
Note: Many use-cases requiring bind operations can also be solved using the cancellableTaskValidation computation expression.
Sequentially validating a user exists before validating their permissions:
let validateUserWithPermissions (userId: UserId) : CancellableTaskValidation<UserWithRole, string> =
fetchUser userId
|> CancellableTaskValidation.bind (fun user -> fetchAndValidateRole user)Chaining validation steps in a pipeline:
let processPayment (request: PaymentRequest) : CancellableTaskValidation<Receipt, PaymentError> =
validatePaymentRequest request
|> CancellableTaskValidation.bind authorizePayment
|> CancellableTaskValidation.bind chargeCardUsing bind inside a cancellableTaskValidation CE with sequential steps:
let createUser (input: CreateUserInput) : CancellableTaskValidation<UserId, string> =
cancellableTaskValidation {
let! validatedEmail = validateEmail input.Email
// bind is used implicitly here — short-circuits if validateEmail fails
let! userId = createUserRecord validatedEmail input.Name
return userId
}