Есть ли стандартный вариант рабочего процесса в F#?

StackOverflow https://stackoverflow.com/questions/7818277

Вопрос

Есть ли вариант (возможно) Wokflow (Monad) в библиотеке Standrd F#?

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

Это было полезно?

Решение

В стандартной библиотеке 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 это просто не получает.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top