Мне кажется, вы пытаетесь сопоставить ошибку или получить значение по умолчанию в случае ошибок.Вот несколько опций
type Envelope<'a> = {
Content : 'a
Errors : string list
}
/// (unit -> 'a) -> Envelope<'a> -> 'a
let defaultWith f e =
match e.Errors with
| [] -> e.Content
| _ -> f()
Эта опция получает значение, и если возникает ошибка, то вызывается функция для получения значения по умолчанию.Это эквивалентно Option.defaultWith
.Он не возвращает Envelope
.
Этот следующий позволяет отображать ошибки, только если есть ошибки:
/// (string list -> string list) -> Envelope<'a> -> Envelope<'a>
let mapErrors f e =
match e.Errors with
| [] -> e
| _ -> { e with Errors = f e.Errors }
Эти два, с другой стороны, позволяют вамотобразить весь конверт, если есть ошибки.Вы можете создать много вариантов одной и той же темы, которую я только что оставил 2 для иллюстрации:
/// ('a -> Envelope<'a>) -> Envelope<'a> -> Envelope<'a>
let mapIfErrors f e =
match e.Errors with
| [] -> e
| _ -> f e.Content
/// ('a -> string list -> Envelope<'a>) -> Envelope<'a> -> Envelope<'a>
let mapIfErrors2 f e =
match e.Errors with
| [] -> e
| _ -> f e.Content e.Errors