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.

¿Fue útil?

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í.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top