Существует ли стандартная опция рабочего процесса в F #? - PullRequest
26 голосов
/ 19 октября 2011

Есть ли опция (возможно) wokflow (монада) в стандартной библиотеке F #?

Я нашел дюжину реализаций ручной работы ( 1 , 2).) этого рабочего процесса, но я действительно не хочу вводить нестандартный и не очень надежный код в свой проект.И все мыслимые запросы к google и msdn не дали мне понятия, где его найти.

Ответы [ 3 ]

18 голосов
/ 19 октября 2011

Не существует стандартного компоновщика вычислений для опций, но если вам не нужны такие вещи, как лень (как добавлено в примерах, которые вы связали), код достаточно прост, чтобы не было причин ему не доверять (особенно с учетом предположительно названного Option.bind функция из стандартной библиотеки).Вот довольно минимальный пример:

type OptionBuilder() =
    member x.Bind(v,f) = Option.bind f v
    member x.Return v = Some v
    member x.ReturnFrom o = o
    member x.Zero () = None

let opt = OptionBuilder()
16 голосов
/ 19 октября 2011

В стандартной библиотеке F # нет монады Maybe.Возможно, вы захотите взглянуть на FSharpx , расширение F #, написанное высококвалифицированными членами сообщества F #, которое имеет целый ряд полезных монад.

0 голосов
/ 29 апреля 2018

Я создал библиотеку с открытым исходным кодом. FSharp.Interop.NullOptAble доступен для nuget.

Он не только работает как рабочий процесс с опциями, но и работает как нулевой или обнуляемый рабочий процесс какхорошо.

let x = Nullable(3)
let y = Nullable(3)
option {
    let! x' = x
    let! y' = y
    return (x' + y')
} (* |> should equal (Some 6) *)

Работает так же хорошо, как

let x = Some(3)
let y = Some(3)
option {
    let! x' = x
    let! y' = y
    return (x' + y')
} (* |> should equal (Some 6) *)

Или даже

let x = "Hello "
let y = "World"
option {
    let! x' = x
    let! y' = y
    return (x' + y')
} (* |> should equal (Some "Hello World") *)

И если что-то есть null или None

let x = "Hello "
let y:string = null
option {
    let! x' = x
    let! y' = y
    return (x' + y')
} (* |> should equal None *)

Наконец, если у вас много вещей типа nullable, у меня есть cexpr для chooseSeq {}, а если вы yield! что-то null / None, это просто не получится.

См. Больше примеров здесь .

...