2010-08-19 21 views
5

¿Es cada método en una clase que devuelve this una mónada?¿Todos los métodos devuelven `this` a monad?

+1

Tenía la impresión de que las mónadas eran funcionales por naturaleza, entonces, ¿por qué la etiqueta de oop? – Oded

+0

No tengo una respuesta definitiva, pero creo que sería una afirmación difícil de fundamentar sin establecer algunas restricciones adicionales sobre la definición de clase que es exactamente la elegida. – Gian

+2

@Oded: una mónada es una construcción categórica que ha encontrado aplicaciones en algunos lenguajes de programación funcionales. La etiqueta OOP es relevante en este caso, porque creo que OP está preguntando cómo relacionar estos dos mundos. @Krabbe, creo que es posible que cualquier método que no modifique el estado dentro del objeto sea una mónada. Sin embargo, si alguna clase 'C' tiene el método' A' que actualiza algún estado, entonces la relación de identidad 'C == CA()' ya no se cumple, y no estoy seguro de que la definición de una mónada se mantenga bajo esas condiciones . – Gian

Respuesta

4

Tengo una comprensión limitada de las mónadas. No puedo decir si cumple con la definición formal de una mónada (no lo creo, pero no estoy seguro), pero return this; por sí solo no permite ninguna de las cosas interesantes que permiten las mónadas (las interfaces fluidas son agradable, pero no mónadas imho y en ninguna parte tan útil como incluso las mónadas simples como la opción tipo de mónada).

Este fragmento de Wikipedia parece decir "no":

Formalmente, una mónada se construye definir dos operaciones (BIND y vuelta) y un constructor de tipo M [... más restricciones que no es necesario aquí]

Editar: Por otra parte, una mónada es un tipo y no una operación (por ejemplo, método) - la pregunta más bien debería decir "¿es una clase de una mónada si todos sus métodos de devolución this?" </nitpick >

+1

Esa es la definición de una implementación de mónadas. La definición categórica es que básicamente es un endofunctor con dos transformaciones naturales. Probablemente valga la pena mirar http://en.wikipedia.org/wiki/Monad_(category_theory) en lugar de la versión de los lenguajes de programación, que parece muy específica de Haskell. – Gian

+1

Sin duda vale la pena mirarlo, pero apenas capto la implementación de las mónadas reales en Haskell, y mucho menos la teoría detrás de eso - alguien más inteligente debería hacer eso e iluminarnos, por favor :) – delnan

+1

No estoy de acuerdo con esta respuesta, pero Estoy votando porque creo que los votos a favor son injustos. No es una mala respuesta con respecto a la superficialidad de la pregunta. – Gian

7

Voy a decir una muy cautelosa "posiblemente". Mucho de esto depende de tus definiciones.

Vale la pena señalar que estoy tomando la definición de mónada del category theory construct, no el functional programming construct.

Si se piensa en un método de la clase AC que se asigna una instancia a otra CC instancia (es decir, se vuelve this), entonces esto parece que C.A() es un funtor de la categoría que consiste en C ejemplificaciones a sí mismo. Por lo tanto, es un endofunctor, al menos. Parecería que esta construcción obedece a las propiedades básicas de identidad y asociatividad que esperamos, pero se requeriría una inspección adicional para decirlo con certeza.

De todos modos, no apostaría mi vida por ello, y no estoy seguro de que esta sea una forma muy útil de pensar en tales construcciones, pero parece una suposición razonable en la primera inspección, al menos.

+0

Supongo que la pregunta original probablemente se refería a las mónadas de la programación funcional, este es un sitio web de programación, pero de todos modos encontré esta una respuesta interesante. Si el método modificó el estado global, que los lenguajes OOP generalmente permiten, entonces supongo que ya no podría tratar las instancias de C como una categoría y esto no funcionaría ... – minimalis

+0

... Debo señalar que no he estudiado la teoría de categorías, y lo anterior puede ser basura (pero me gustaría) – minimalis

+2

La definición de mónadas en algo así como Haskell se deduce de la definición en la teoría de categorías, por lo que hablar de una es básicamente hablar sobre la otra (con respecto a algunos casos de esquina). Elegí usar la definición categórica precisamente porque algún lenguaje OOP sin sintaxis explícita para mónadas nunca se ajustará a la definición proporcionada por un lenguaje con sintaxis explícita. Si sus métodos están modificando el estado global, entonces sí, la definición puede ser un poco arriesgada, pero una minoría de los verdaderos lenguajes OOP en realidad lo permiten (en lugar de lenguajes imperativos con objetos conectados). – Gian

1

En mi opinión, Nº

Hay al menos dos problemas que veo con él.

  1. Una mónada suele ser un pegamento entre dos funciones. En este caso MethodA devuelve un tipo en el que se invoca la siguiente methodB, (y por supuesto MethodA y methodB ambos pertenecientes al mismo tipo).
  2. Se supone que una mónada permite transformaciones de tipo. Así que si funciónA vuelve Typex y funciónB espera TypeY, la mónada tiene que proporcionar una operación de enlace que puede convertir un Mónada (Typex) en un Mónada (TypeY).La mónada continuación, pasa a tener el valor de retorno de la primera función, lo envuelve como un Mónada (Typex), transformarlo a Mónada (TypeY) de la que TypeY conseguiría extrae y se introduce en funciónB.

Un método que devuelve esto es en realidad una implementación de Fluent Interface. Y aunque muchos han argumentado que también es un monádico, solo diría que si bien ayuda a resolver problemas similares a lo que las mónadas podrían resolver de otra manera, y mientras que la solución parecería similar a cómo podría funcionar una solución monádica (en lugar de la " . "operador, el método de vinculación de la mónada debe invocarse sin ningún bloque do explícito), no es una mónada. En otras palabras, puede caminar como una mónada y hablar como una mónada, pero no es una mónada.

Corrección leve a punto 2: La mónada necesita proporcionar mecanismos para a) convertir Typex en Mónada (Typex), transformar de Mónada (Typex) para Mónada (TypeY) y una coerción de Mónada (TypeY) para TypeY

+2

1: mediante el encadenamiento de métodos, esto es trivialmente factible, p. 'C.X(). Y(). Z()', la ejecución del tipo requiere que tengan el mismo dominio y tipos de rango. 2: Es un problema de ejecución del sistema de tipo, pero esto es trivialmente representable en la mayoría de los lenguajes que tienen una noción de 'objeto', porque también tienen nociones tales como interfaces o clases abstractas. En cuanto a su tercer párrafo, no estoy seguro de haber visto allí una condición que excluya el tipo de definición que el OP estaba preguntando. Hiciste un gesto con la mano desde "esto parece otra cosa" hasta "por lo tanto, no es una mónada". – Gian

+0

Una mónada agrega valor entre el valor de retorno de una función y la invocación de la siguiente y también realiza el enlace necesario. En este caso, la salida de un método se aplica directamente a la siguiente, y al ser un lenguaje OO, el enlace se integra simplemente en el "." operador provisto por el idioma. Además, no hay posibilidad de que el tipo de retorno de una función sea transformado por la mónada en un tipo diferente. Así que estoy diciendo que no puedo ver la adición de valor o el papel que juegan las mónadas en este contexto. Las mónadas realizan una adición de valor en una tubería. En este caso, solo veo la tubería. –

+1

Ciertamente estoy de acuerdo en que las cosas que razonablemente se pueden llamar "mónadas" (o en forma de mónada) en esta configuración probablemente no sean muy interesantes, pero me parece que la forma básica sigue siendo la misma. Las transformaciones naturales parecen ser fácilmente capturadas por herencia simple y down-casting. Algunos lenguajes OO lo harán felizmente como coerción implícita, por lo que existe la posibilidad de que el tipo de retorno de una función se transforme en un tipo diferente. – Gian

4

Probablemente no, al menos no de las maneras habituales.

Las mónadas en la programación generalmente se definen sobre una categoría de tipos con funciones como flechas. En ese caso, un método que devuelve this es una flecha de la clase a sí mismo - esto es un morfismo endo con el monómero habitual de composición de funciones, pero no es un functor.

Tenga en cuenta que los funtores que implican tipos de función son ciertamente posible, pero un funtor F(A) => (A -> A) no funciona muy bien porque el tipo aparece tanto en la covariante y contravariante posición, es decir, dada una función A -> B puede enviar a A -> AA -> B, o puede enviar B -> B a A -> B, pero no puede obtener B -> B de A -> A o viceversa.


Sin embargo, hay una forma de ver instancias como tener estructura monádica. Considere que los métodos de instancia efectivamente tienen this como un argumento implícito. Entonces, para alguna clase C, sus métodos son funciones de C a cualquier otro tipo. Esto corresponde aproximadamente al functor de función covariante anterior. Tenga en cuenta que no estoy describiendo ninguna clase particular aquí, sino todo el concepto de clases y casos. Por lo tanto, para este mapeo de C a los métodos de instancia de C:

  • Si tenemos un método de instancia de regresar algún tipo A y una función con el tipo A -> B, podemos definir trivialmente un método devolver algo del tipo B: eso es el resto de la definición de functor, también conocida como 'fmap` en Haskell.

  • Si tenemos algún valor de tipo A, podemos añadir un método de instancia trivial de que sólo devuelve ese valor: eso es la operación de la mónada "unidad", también denominado return en Haskell.

  • Si tenemos un método de instancia devolver un valor de tipo A, y otro método de instancia teniendo un argumento de tipo A y devolver un valor de tipo B, podemos definir un método que simplemente devuelve un valor de tipo B por combinándolos.Ese es el enlace monádico, a.k. a. (>>=) en Haskell.

Haskell llama la mónada de "funciones que todos damos un primer argumento de algún tipo fijo" del lector Mónada, y la notación do por ello le permite escribir código en el que el primer argumento es implícitamente disponible - más bien como la forma en que this está implícitamente disponible dentro de los métodos de instancia.

La diferencia aquí es que con instancias de clases, la estructura monádica es ... más o menos al nivel de la sintaxis, algo que no se puede utilizar directamente en un programa, al menos no en la mayoría de los idiomas.

Cuestiones relacionadas