Есть ли стандартный вариант рабочего процесса в F#?
Решение
В стандартной библиотеке F# нет Монады. Вы можете посмотреть Fsharpx, расширение F#, написанное высококвалифицированными членами сообщества F#, которое имеет довольно много полезных монадов.
Другие советы
Не существует стандартного построителя вычислений для вариантов, но если вам не нужны такие вещи, как лень (как добавлено в примерах, которые вы связаны), код достаточно прост, что нет причин не доверять ему (особенно с учетом наводящего наменения 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()
Я создаю библиотеку OpenSource 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 *)
Наконец, если у вас много нулевых типов, у меня есть Cexpr для chooseSeq {}
и если вы yield!
что-нибудь null
/None
это просто не получает.
Смотрите больше примеров здесь.