f# workflow option monads maybe

¿Hay un flujo de trabajo de opción estándar en F#?



workflow option (3)

¿Hay una opción (quizás) wokflow (mónada) en la biblioteca estándar de F #?

He encontrado una docena de implementaciones hechas a mano ( 1 , 2 ) de este flujo de trabajo, pero realmente no quiero introducir código no estándar ni muy confiable en mi proyecto. Y todas las consultas imaginables a google y msdn no me dieron ninguna pista de dónde encontrarlo.


He creado una biblioteca de FSharp.Interop.NullOptAble abierto FSharp.Interop.NullOptAble disponible en nuget.

No solo funciona como un flujo de trabajo opcional, sino que también funciona como un flujo de trabajo nulo o anulable.

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 chooseSeq {} yield! algo null / None que simplemente no se rinde.

Ver más ejemplos here .


No hay Tal vez una mónada en la biblioteca estándar de F #. Es posible que desee ver FSharpx , una extensión de F # escrita por miembros altamente calificados de la comunidad de F #, que tiene bastantes monadas útiles.


No hay un generador de cómputo estándar para las opciones, pero si no necesita cosas como la pereza (como se agrega en los ejemplos que vinculó), el código es lo suficientemente directo como para que no haya razón para no confiar en él (especialmente dada la función sugestivamente llamada Option.bind ). de 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()