Sí, son equivalentes en el sentido de que el Option
tipo junto con el Option.bind
constructor de tipos Some
constituyen una mónada.
Si bien las mónadas (como en la Monad
clase de tipos) son una parte central de la identidad de Haskells, desde un punto de vista conceptual son una construcción independiente del lenguaje. Un patrón de diseño si quieres. Si tiene un tipo, y tiene un enlace y una función de retorno con firmas específicas que obedecen a un conjunto particular de leyes, tiene una mónada, independientemente del idioma que use.
Las expresiones de cálculo F # solo proporcionan un azúcar de sintaxis programable para mónadas, similar a la notación do en Haskell. Si bien no hay un Option
generador de expresiones de cálculo provisto de fábrica, puede definir fácilmente uno básico como este:
type OptionBuilder () =
member this.Bind(m, f) = Option.bind f m
member this.Return(a) = Some a
let option = OptionBuilder ()
Y úsalo así:
let c =
option {
let! a = Some 4
let! b = None
return a + b
}
que es un equivalente azucarado de algo como esto:
let c =
(Some 4)
|> Option.bind (fun a ->
None
|> Option.bind (fun b ->
Some (a + b)))
Observe cómo los miembros del constructor reflejan la Monad
clase de tipo y cómo puede escribir código monádico, incluso si es complicado, sin un generador.
that's not the case
? Se parecen mucho a mí.