2009-03-20 17 views
16

Si può dire che le continuazioni siano monadi? Sono un sottoinsieme di monadi o sono semplicemente un modo per implementare le monadi?Le monadi di continuazione?

Edit: O forse mi sono sbagliato e monadi è un concetto più astratto di continuazioni? (Quindi sto davvero confrontando le mele con le arance qui)

+1

Continuazioni sono tutto. Le continue possono implementare strutture dati; le continuazioni possono implementare classi e oggetti; le continuazioni possono implementare le monadi.Non vedo che cosa abbia a che fare questa domanda con Haskell, però, a parte avere entrambe le continuazioni e le monadi ... – ephemient

+0

Neanche io. In primo luogo non ho aggiunto il tag Haskell e sinceramente sono più interessato a una spiegazione in un contesto diverso. – troelskn

+1

@troelskn: sono d'accordo con la tua modifica; le continuazioni sono una bestia diversa dalle monadi. È un po 'come chiedere se le assi di legno sono una casa. Loro * potrebbero * essere, se messi insieme come tali. Ma potrebbero anche essere molte altre cose. –

risposta

17

In breve, poiché la "legatura" di una monade prende una continuazione effettiva (una lambda del "resto del calcolo") come argomento, le monadi sono continuazioni in tal senso. Il rovescio della medaglia, lo stile di passaggio di continuazione può essere efficacemente implementato in un linguaggio non CPS che utilizza zuccheri sintattici monadici, come suggerito da numerosi link di vario genere qui sotto.

Dal 'tutta una questione monadi' esercitazione in Haskell:

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

Un F # continuazione Monade, utilizzato per implementare 'pausa' e 'continuare' per per-style-loops

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

e l'esempio di applicazione di una monade continuazione di un problema in F #:

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

6

Possono essere, anche se non è necessario. Invertire la tua domanda un po 'e dire invece che le monadi sono un modo per implementare le continuazioni. Ma puoi implementare le continuazioni in molti modi: puoi fare un facsimile modesto ma vincolato di CPS in C# senza troppi sforzi, for example. Dai un'occhiata allo The Continuation Monad dal sito di Haskell per un trattamento molto accurato.

+0

Mi sono un po 'emozionato, ma quello non è CPS in C#. È una funzione di utilità che accetta una funzione e restituisce il valore restituito da quella funzione al chiamante. Niente a che vedere con CPS. –

+0

Oops, collegamento errato. Fisso. Come notato, questa è solo un'approssimazione di CPS, non reale CPS (non credo sia possibile in C#, ma dovrei pensarci un po 'di più). –

22

Non solo sono monadi di continuazione, ma sono una sorta di monade universale, nel senso che se si dispone di continuazioni e stato, è possibile simulare qualsiasi monade funzionale. Questo risultato impressionante, ma molto tecnico viene dalla mente impressionante e altamente tecnico di Andrzej Filinski, che ha scritto nel 1994 o giù di lì:

Mostriamo che ogni monade cui operazioni unitarie e di estensione sono esprimibili come termini puramente funzionali possono essere incorporati in un linguaggio call-by-value con "continuazioni componibili".

+0

Sono d'accordo sul risultato. Permettetemi di sottolineare che questo embedding è in una lingua con "delimitata" (o come dice Filinski "continuabile") continuazioni. Questi sono strettamente più potenti dei valori di continuazione che si ricevono da call/cc in Scheme. – dubiousjim

+2

@profjim: in realtà, Filinski ha anche mostrato come implementare continuazioni delimitate usando continuazioni e stato ordinari. Ha implementato il tutto in SML/NJ usando callcc. – RD1

4

Un bel articolo su questo argomento: http://blog.sigfpe.com/2008/12/mother-of-all-monads.html

+2

+1 per aver citato il blog di sigfpe. Che bel tesoro di meraviglie. L'autore riesce a spiegare la teoria delle categorie e altri concetti lontani in modo dettagliato, illuminante, ma realistico. Le persone più intelligenti, nel mio libro, sono i migliori insegnanti. –

1

Una continuazione è una particolare funzione in un programma. Le Monade sono costruttori di tipi.

Un costruttore di tipo Cont<T> per il proseguimento del tipo T non è una monade.

Tuttavia, Cont<Cont<T>> è una monade, e questo è ciò che viene comunemente chiamato "la monade di continuazione".

(Avere callcc in una lingua equivale ad essere in grado di convertire Cont<Cont<T>>-T.)