Sí, son equivalentes en el sentido de que el Optiontipo junto con el Option.bindconstructor de tipos Someconstituyen una mónada.
Si bien las mónadas (como en la Monadclase 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 Optiongenerador 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 Monadclase 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í.