Question

Y at-il une option (peut-être) wokflow (monade) dans la bibliothèque de standrd F #?

J'ai trouvé une douzaine de mises en œuvre à la main ( 1 , 2 ) de ce flux de travail, mais je ne veux pas vraiment d'introduire non standard et pas de code très confiance dans mon projet. Et toutes les requêtes imaginables à Google et msdn m'a donné aucune idée où trouver.

Était-ce utile?

La solution

Il n'y a pas monade Peut-être que dans la bibliothèque standard F #. Vous voudrez peut-être regarder FSharpx , une extension F # écrit par des membres hautement qualifiés de F # communauté , qui a un certain nombre de monades utiles.

Autres conseils

Il n'y a pas de constructeur de calcul standard pour les options, mais si vous n'avez pas besoin des choses comme la paresse (comme ajoutée dans les exemples que vous lié) le code est assez simple qu'il n'y a aucune raison de ne pas lui faire confiance (en particulier compte tenu de la Option.bind suggestivement nommé fonction de la bibliothèque standard). Voici un exemple assez minime:

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

J'ai créer une bibliothèque opensource FSharp.Interop.NullOptAble disponible sur NuGet .

Il fonctionne non seulement comme un flux de travail d'option, mais il fonctionne comme un nul ou flux de travail annulable ainsi.

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

fonctionne aussi bien que

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

Ou même

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

Et si quelque chose est null ou None

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

Enfin, si vous avez beaucoup de choses de type Nullable, j'ai un cexpr pour chooseSeq {} et si vous yield! quelque chose null / None il ne comprend tout simplement pas donné.

Voir d'autres exemples .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top