Y at-il un workflow option standard F #?
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.
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é.