Frage

Gibt es in der Standrd F# -Bibliothek eine Option (vielleicht) Wokflow (Monad)?

Ich habe ein Dutzend von handgefertigten Implementierungen gefunden (1, 2) Von diesem Workflow, aber ich möchte nicht wirklich nicht standardmäßige und nicht sehr vertrauenswürdige Code in mein Projekt einführen. Und alle erdenklichen Abfragen an Google und MSDN gaben mir keine Ahnung, wo ich sie finden konnte.

War es hilfreich?

Lösung

In der Standard -F# -Bibliothek gibt es vielleicht keine Monate. Vielleicht möchten Sie sich ansehen Fsharpx, Eine F#-Erweiterung, die von hochqualifizierten Mitgliedern der F# Community geschrieben wurde und eine Reihe von nützlichen Monaden hat.

Andere Tipps

Es gibt keinen Standard -Berechnungserbauer für Optionen, aber wenn Sie keine Dinge wie Faulheit benötigen (wie in den von Ihnen verlinkten Beispielen hinzugefügt) ist der Code unkompliziert genug, dass es keinen Grund gibt, ihm nicht zu vertrauen (insbesondere angegeben, dass der genannte Suggestiv genannt wird Option.bind Funktion aus der Standardbibliothek). Hier ist ein ziemlich minimales Beispiel:

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()

Ich erstelle eine OpenSource -Bibliothek Fsharp.interop.nulloptable Erhältlich auf Nuget.

Es funktioniert nicht nur als Options -Workflow, sondern auch als Null- oder Nullier -Workflow.

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

Funktioniert genauso gut wie

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

Oder auch

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

Und wenn etwas ist null oder None

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

Wenn Sie schließlich viele nullbare Typ -Dinge haben, habe ich einen Cexpr für chooseSeq {} Und wenn Du yield! etwas null/None Es wird einfach nicht nachgegeben.

Weitere Beispiele sehen hier.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top