2009-03-20 15 views
16

¿Se puede decir que las continuas son mónadas? ¿Son un subconjunto de mónadas o son simplemente una forma de implementar mónadas?¿Son las continuas mónadas?

Editar: O tal vez me equivoqué y mónadas es un concepto más abstracto que continuaciones? (Así que realmente estoy comparando manzanas con naranjas aquí)

+1

continuaciones son todo. Las continuas pueden implementar estructuras de datos; las continuaciones pueden implementar clases y objetos; las continuaciones pueden implementar mónadas.No veo qué tiene que ver esta pregunta con Haskell, además de tener ambas continuaciones y mónadas ... – ephemient

+0

Yo tampoco. No agregué la etiqueta Haskell en primer lugar y francamente estoy más interesado en una explicación en un contexto diferente. – troelskn

+1

@troelskn: estoy de acuerdo con su edición; las continuaciones son una bestia diferente a las mónadas. Es como preguntar si las tablas de madera son una casa. Ellos * podrían * ser, si se unen como tales. Pero también podrían ser muchas otras cosas. –

Respuesta

17

En pocas palabras, dado que el 'enlace' de una mónada toma una continuación efectiva (una lambda del 'resto de la computación') como argumento, las mónadas son continuaciones en ese sentido. Por otro lado, el estilo de continuación y paso se puede implementar de manera efectiva en un lenguaje que no sea de CPS utilizando azúcares de sintaxis monádica, como lo sugieren varios enlaces a continuación.

Desde el 'todo sobre mónadas' Tutorial en Haskell:

https://www.haskell.org/haskellwiki/All_About_Monads#The_Continuation_monad

Un F mónada # continuación, se utiliza para poner en práctica 'break' y 'continuar' para fines de estilo-bucles

http://cs.hubfs.net/forums/thread/9311.aspx

y el ejemplo de la aplicación de una mónada continuación a un problema en Fa #:

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256.entry

6

Pueden serlo, aunque no es necesario. Revertiría un poco su pregunta y, en cambio, diría que las mónadas son una forma de implementar las continuas. Pero puede implementar continuaciones de muchas maneras: puede hacer un facsímil modesto pero restringido de CPS en C# sin demasiado esfuerzo, for example. Eche un vistazo a The Continuation Monad desde el sitio de Haskell para un tratamiento muy completo.

+0

Me emocioné un poco, pero eso no es CPS en C#. Es una función de utilidad que toma una función y devuelve el valor devuelto por esa función a la persona que llama. Nada que ver con CPS. –

+0

Vaya, enlace equivocado. Fijo. Como se señaló, esto es solo una aproximación a CPS, no a CPS real (no creo que eso sea posible en C#, pero tendría que pensarlo un poco más). –

22

No solo son mónadas de continuación, sino que son una especie de mónada universal, en el sentido de que si tiene continuaciones y estado, puede simular cualquier mónada funcional. Este resultado impresionante, pero muy técnico viene de la mente impresionante y altamente técnica de Andrzej Filinski, que escribió en 1994, más o menos:

Mostramos que cualquier mónada, cuya unidad y extensión operaciones son expresables como términos puramente funcionales se pueden incrustar en un lenguaje call-by-value con "continuaciones compostables".

+0

Acepto que el resultado es impresionante. Permítanme subrayar que esta incrustación está en un lenguaje con continuaciones "delimitadas" (o como Filinski dice "composable"). Estos son estrictamente más potentes que los valores de continuación que recibe de call/cc en Scheme. – dubiousjim

+2

@profjim: en realidad, Filinski también mostró cómo implementar continuaciones delimitadas usando continuaciones y estado ordinarios. Implementó todo en SML/NJ utilizando callcc. – RD1

4

Un artículo muy agradable en ese tema: http://blog.sigfpe.com/2008/12/mother-of-all-monads.html

+2

+1 por citar el blog de sigfpe. Qué hermoso tesoro oculto de asombro. El autor logra explicar la teoría de categorías y otros conceptos lejanos de una manera detallada, esclarecedora, pero realista. Las personas más inteligentes, en mi libro, son los mejores maestros. –

1

Una continuación es una función particular en un programa. Las mónadas son constructores de tipos.

Un tipo de constructor Cont<T> para continuaciones que toman el tipo T no sería una mónada.

Sin embargo, Cont<Cont<T>> es una mónada, y esto es lo que comúnmente se llama "la mónada de continuación".

(Tener callcc en un idioma que es equivalente a ser capaz de convertir de Cont<Cont<T>> a T.)

Cuestiones relacionadas