Конечно, более конкретный типа союза может быть хорошо для конкретной ситуации, но имеющие общий Выбор союза означает, что ваш код может хорошо сцепляется с другим кодом при использовании общих конструкций, таких как Workflows, функторы и т.д.
IIRC в стандартной библиотеке FSharp Core не существует реализации Либо Monad (Workflow в F # lingo), но есть одна в библиотеке FSharpx (, хотя я не мог найти конструктор для нее, поэтому мне пришлось сворачивать свои собственные спасибо @MauricioScheffer за то, что он поместил меня в choose
).
Из моего ограниченного, в основном, C# interop, опыта F #, выбора и опции не запекаются в стандартных методах F # так же, как Haskell's Maybe, и любые алгебраические типы данных запекаются в его стандартные библиотеки, поэтому вы не получите большая часть «этого полезного» смысла при использовании их в F #, как вы могли бы в Haskell, но они весьма полезны.
Что касается примера: в приложении, которое я недавно написал, я вернул Choice1Of2 из методов, когда у меня был успешный результат, и Choice2Of2 с сообщением об ошибке, когда что-то пошло не так - было ли исключение исключено или предварительное условие не выполнено - - и запустил мой код в Workflow для управления потоком. Это одно стандартное использование этого типа объединения.
https://github.com/fsharp/fsharpx/blob/master/tests/FSharpx.Tests/ChoiceTests.fs https://github.com/ fsharp/fsharpx/blob/master/tests/FSharpx.Tests/ValidationTests.fs https://github.com/fsharp/fsharpx/blob/master/tests/FSharpx.Tests/ValidationExample.fs –
Что похоже на Haskell's Либо http : //hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Either.html –