A coherent application architecture model for F# on .NET.
Structured composition over normal F#/.NET code
FsFlow is a unified model for building robust, Result-based programs. Write predicate checks once, keep fail-fast logic in
Result, accumulate sibling failures with Validation, then lift the same logic into Flow when the boundary needs environment access, async work, task interop, cancellation, or runtime policy.
type RegistrationError =
| EmailMissing
| UserNotFound
let validateEmail (email: string) : Result<string, RegistrationError> =
email
|> Check.whenNotBlank
|> Check.withError EmailMissing
type User =
{ Email: string }
type Api =
{ LoadUser: int -> Task<Result<User, RegistrationError>> }
let readVerifiedEmail userId =
flow {
let! loadUser = Flow.read _.LoadUser
let! user = loadUser userId
return! validateEmail user.Email |> Flow.fromResult
}