¿Existe un flujo de trabajo de opción estándar en f#?
Pregunta
¿Hay una opción (tal vez) wokflow (mónada) en la biblioteca standrd f#?
Encontré una docena de implementaciones hechas a mano (1, 2) de este flujo de trabajo, pero realmente no quiero introducir un código no estándar y no muy confiable en mi proyecto. Y todas las consultas imaginables a Google y MSDN no me dieron ni idea de dónde encontrarlo.
Solución
No hay tal vez mónada en la biblioteca estándar F#. Es posible que desee mirar Fsharpx, Una extensión F# escrita por miembros altamente calificados de F# Community, que tiene una cantidad de mónadas útiles.
Otros consejos
No hay un constructor de computación estándar para las opciones, pero si no necesita cosas como la pereza (como se agregó en los ejemplos que vinculó), el código es lo suficientemente sencillo como para que no hay razón para no confiar en él (particularmente dado el llamado sugerentemente nombrado Option.bind
función desde la biblioteca estándar). Aquí hay un ejemplo bastante mínimo:
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()
He creado una biblioteca de OpenSource Fsharp.interop.nulloPtable Disponible en Nuget.
No solo funciona como un flujo de trabajo de opción, sino que también funciona como un flujo de trabajo nulo o anulado.
let x = Nullable(3)
let y = Nullable(3)
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal (Some 6) *)
Funciona tan bien como
let x = Some(3)
let y = Some(3)
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal (Some 6) *)
O incluso
let x = "Hello "
let y = "World"
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal (Some "Hello World") *)
Y si algo es null
o None
let x = "Hello "
let y:string = null
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal None *)
Finalmente, si tienes muchas cosas de tipo anulable, tengo un CEXPR para chooseSeq {}
y si tu yield!
alguna cosa null
/None
Simplemente no se produce.
Ver más ejemplos aquí.