- Use `Result<'Ok, 'Error>` for all fallible operations instead of exceptions for expected failure cases.
- Use `result { let! x = op1(); let! y = op2(x); return y }` computation expressions to sequence `Result`-returning operations cleanly.
- Define a domain-specific `DomainError` discriminated union instead of using `exn` or `string` as the error type.
- Use `Result.map`, `Result.bind`, and `Result.mapError` to transform values without unwrapping in intermediate pipeline steps.