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


¿Hay una opción (tal vez) wokflow (mónada) en la biblioteca standrd 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 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.

Author: Community, 2011-10-19

3 answers

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

 15
Author: pad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-19 09:43:31

No hay un constructor de cómputo 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 haya razón para no confiar en él (particularmente dada la sugerente función Option.bind de la biblioteca estándar). He aquí 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()
 15
Author: kvb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 17:02:34

He creado una biblioteca de código abierto 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 null o nullable.

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

Funciona igual de bien que

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 un montón de cosas de tipo nullable, tengo un cexpr para chooseSeq {} y si yield! algo null/None simplemente no consigue ceder.

Ver más ejemplos aquí.

 0
Author: jbtule,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-29 18:45:42