В дополнение к использованию типа Option
, предложенного dumetrulo, вы можете использовать тип Result
для описания ваших бизнес-ошибок в зависимости от конкретного домена.Например, вы можете определить тип, который перечисляет ожидаемые вами случаи ошибок, включая пустой список или любые другие ваши правила (допустим, вы не хотите допускать никаких отрицательных значений в списке), а затем вернуть Error
с конкретным случаем ошибки или Ok
со значением:
type AggregateError =
| ListIsEmpty
| ListContainsNegativeValues
let average = function
| [] -> Error ListIsEmpty
| list when list |> List.exists ((>) 0.0) -> Error ListContainsNegativeValues
| values -> Ok <| List.average values
Здесь, если вы запустите average
для пустого списка, вы получите Error ListIsEmpty
.
average [];;
val it : Result<float,AggregateError> = Error ListIsEmpty
Если вы запустите average
для списка, который содержит одно или несколько отрицательных значений, вы получите Error ListContainsNegativeValues
.
average [1.0; -1.0];;
val it : Result<float,AggregateError> = Error ListContainsNegativeValues
В противном случае вы получите Ok
с фактическим средним значением:
average [0.0; 1.0; 3.0; 5.0];;
val it : Result<float,AggregateError> = Ok 2.25