Estaba haciendo una presentación sobre F # y estaba discutiendo el tipo de Opción cuando alguien en la audiencia me preguntó si el tipo de Opción es la implementación de F # de la mónada quizás. Sé que ese no es el caso, pero quería preguntar cómo se relacionan los dos conceptos. Quiero decir que me parece que un tipo de opción podría ser el resultado de la operación de una mónada, pero ni siquiera estoy seguro de eso.
¿Alguien aclararía la relación entre tal vez la mónada y el tipo de opción en esos lenguajes funcionales que lo admiten?
functional-programming
monad
Onorio Catenacci
fuente
fuente
that's not the case
? Se parecen mucho a mí.Respuestas:
Al leer la documentación sobre el tipo de F #
Option
, parece que se comporta casi exactamente como elMaybe
tipo en Haskell, en el sentido de que puede modelar 'nada' (None
en F #,Nothing
en Haskell) o un valor de su tipo de argumento (Some
en F #,Just
en Haskell)En Haskell, sin embargo,
Maybe
también es una mónada, y la plomería es tal que permite el cálculo de losMaybe
valores, lo que devuelve anticipadamenteNothing
si alguna de las variables en el cálculo lo esNothing
. Utilizado de esta manera,Maybe
es un simple controlador de errores (o más bien, un dispositivo que ignora los errores), y el hecho de que sea una mónada permite mover la caldera fuera del camino. Mira este artículo de Wikipedia para un buen ejemplo conciso. No creo que seaOption
compatible con este tipo de uso monádico (de hecho, me pregunto si hay algún concepto explícito de una mónada en F #). Si desea este comportamiento en .NET, supongo que lo usaríaOption.Value
para todos sus argumentos y envolvería todo el cálculo en un intento / capturaNullReferenceException
.Entonces, si bien
Option
es similar alMaybe
tipo , no es equivalente a laMaybe
mónada .fuente
Monad
.Maybe
es un tipo de datos antiguo, pero también se implementaMonad
para proporcionar este comportamiento 'especial'.map
ybind
funciones de F # se comportan de manera idéntica a las funcionesfmap
ybind
funciones de Quizás de Haskell . Ambos son mónadas y tienen un comportamiento monádico equivalente. Haskell solo tiene unaMonad
clase de tipos que le permite manipular mónadas, mientras que en F # son más como un "patrón de diseño" abstracto.Sí, son equivalentes en el sentido de que el
Option
tipo junto con elOption.bind
constructor de tiposSome
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:Y úsalo así:
que es un equivalente azucarado de algo como esto:
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.fuente
Son equivalentes, y ambas son mónadas. La diferencia es que ser una mónada significa algo en Haskell: hay una
Monad
clase de tipo explícita y se puede usar "hacer notación" para eliminar muchas repeticiones al escribir código monádico. En F #, notación constructor ylet!
ydo!
se puede utilizar para deshacerse de texto modelo similar, pero hay no una noción explícita de un tipo de "ser una mónada". El sistema de tipos de Haskell incluye clases de tipos (de las cuales es laMonad
clase general ) y tipos de tipo superior (de los cuales es un individuoMonad
), que permiten escribir código que funciona para todas las mónadas. El sistema de tipos de F # no tiene ninguna de estas características.Entonces sí, F # 's
Option
y Haskell'sMaybe
son idénticos y ambas mónadas. Es solo que Haskell te da mucha más maquinaria para trabajar con mónadas que F #.fuente