Использование Result<'T, 'TError>
имеет большой смысл в тех случаях, когда у вас есть особые виды ошибок, которые вам определенно необходимо обработать, или в случаях, когда у вас есть какая-то другая логика для распространения ошибок, чем та, которая реализована в стандартных исключениях (например, если вы может продолжить выполнение кода, несмотря на то, что произошла ошибка). Однако я бы не стал использовать его в качестве замены 1: 1 для исключений - он просто сделает ваш код излишне сложным и громоздким, не принося вам особых преимуществ.
Чтобы ответить на ваш вопрос, поскольку вы зеркально отражаете стандартные исключения .NET в своем дискриминационном объединении, вы, вероятно, могли бы просто использовать стандартное исключение .NET для вашего типа Result
и использовать Result<'T, exn>
в качестве типа данных:
if arg < 10 then Error(ArgumentOutOfRangeException("arg", "Value is too small"))
else OK(arg - 1)
Относительно случая объединения ArgumentOutOfRange
и TypedValue
- причина использования чего-то вроде TypedValue
, как правило, заключается в том, что вам необходимо сопоставить шаблон с возможными значениями и что-то с ними сделать. В случае исключений, что вы хотите сделать со значениями? Если вам просто нужно сообщить о них пользователю, то вы можете использовать obj
, который позволит вам легко распечатать их (будет не так просто получить числовые значения и провести с ними дальнейшие вычисления, но я не буду Я думаю, тебе это нужно).
type Failure =
| ArgumentOutOfRange of {| Argument : obj; Minimum : obj; Maximum : obj |}