2009-03-20 5 views
16

Können Fortsetzungen gesagt werden, Monaden zu sein? Sind sie eine Teilmenge von Monaden oder sind sie einfach eine Art, Monaden zu implementieren?Sind Fortsetzungen Monaden?

Edit: Oder vielleicht habe ich es falsch und Monaden ist ein abstraktes Konzept als Fortsetzungen? (Also ich vergleiche hier wirklich Äpfel mit Orangen)

+1

Fortsetzungen alles sind. Fortsetzungen können Datenstrukturen implementieren; Fortsetzungen können Klassen und Objekte implementieren; Fortsetzungen können Monaden implementieren.Ich verstehe nicht, was diese Frage mit Haskell zu tun hat, abgesehen von Fortsetzungen und Monaden ... – ephemient

+0

Ich auch nicht. Ich habe das Haskell-Tag an erster Stelle nicht hinzugefügt und ehrlich gesagt bin ich mehr an einer Erklärung in einem anderen Kontext interessiert. – troelskn

+1

@troelskn: Ich stimme deinem Edit zu; Fortsetzungen sind ein anderes Tier als Monaden. Es ist ein bisschen wie die Frage, ob Holzbohlen ein Haus sind. Sie könnten * sein, wenn sie als solche zusammengefügt werden. Aber sie könnten auch viele andere Dinge sein. –

Antwort

17

Kurz gesagt, da die 'Bindung' einer Monade eine effektive Fortsetzung (ein Lambda des 'Rests der Berechnung') als ein Argument nimmt, sind Monaden Fortsetzungen in diesem Sinne. Auf der anderen Seite kann der Fortsetzungs-Passing-Stil in einer Nicht-CPS-Sprache unter Verwendung von monadischen Syntax-Zuckern effektiv implementiert werden, wie es durch eine Anzahl von Misc-Links unten vorgeschlagen wird.

Von der 'alles über Monaden' Tutorial in Haskell:

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

Ein F # Fortsetzung Monade, verwendet zu implementieren 'Bruch' und 'Weiter' für für-style-Schleifen

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

Und Beispiel für eine Fortsetzung Monade zu einem Problem in F # Anwendung:

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

6

Sie können sein, obwohl sie nicht sein müssen. Ich würde deine Frage ein wenig umkehren und stattdessen sagen, dass Monaden eine Art sind, Fortsetzungen zu implementieren. Aber Sie können Fortsetzungen auf viele Arten implementieren - Sie können ein bescheidenes, aber eingeschränktes Faksimile von CPS in C# ohne zu viel Aufwand machen, for example. Werfen Sie einen Blick auf The Continuation Monad von der Haskell Website für eine sehr gründliche Behandlung.

+0

Ich bin ein bisschen aufgeregt, aber das ist nicht CPS in C#. Es ist eine Dienstprogrammfunktion, die eine Funktion übernimmt und den Wert zurückgibt, der von dieser Funktion an den Aufrufer zurückgegeben wird. Nichts mit CPS zu tun. –

+0

Hoppla, falsche Verbindung. Fest. Wie bereits erwähnt, ist dies nur eine Annäherung an CPS, nicht an echtes CPS (ich glaube nicht, dass das in C# möglich ist, aber ich müsste darüber noch ein wenig nachdenken). –

22

Nicht nur Fortsetzungen Monaden, aber sie sind eine Art universelle Monade, in dem Sinne, dass, wenn Sie Fortsetzungen und Zustand haben, können Sie jede funktionelle Monade simulieren. Dieses eindrucksvolle, aber sehr technisches Ergebnis kommt von dem beeindruckenden und sehr technischen Geist Andrzej Filinski, der 1994 oder so ungefähr schrieb:

Wir zeigen, dass jede Monade, deren Einheit und Erweiterung Operationen sind ausdrückbar als rein funktional in eingebettet werden eine Call-by-Value-Sprache mit "zusammensetzbaren Fortsetzungen".

+0

Ich stimme zu, das Ergebnis ist beeindruckend. Lassen Sie mich jedoch unterstreichen, dass diese Einbettung in eine Sprache mit "abgegrenzten" (oder wie Filinski sagt "zusammensetzbaren") Fortsetzungen besteht. Diese sind strikter als die Fortsetzungswerte, die Sie von call/cc in Scheme bekommen. – dubiousjim

+2

@profjim: Tatsächlich hat Filinski gezeigt, wie man begrenzte Fortsetzungen mit gewöhnlichen Fortsetzungen und Zuständen implementiert. Er implementierte das Ganze in SML/NJ mit callcc. – RD1

4

Ein sehr schöner Artikel zu diesem Thema: http://blog.sigfpe.com/2008/12/mother-of-all-monads.html

+2

+1 für das Zitieren von sigfpe's Blog. Was für eine schöne Fundgrube von Großartigkeit. Der Autor schafft es, die Kategorientheorie und andere ferne Konzepte auf eine detaillierte, aufschlussreiche und dennoch bodenständige Art zu erklären. Die klügsten Leute in meinem Buch sind die besten Lehrer. –

1

Eine Fortsetzung ist eine bestimmte Funktion in einem Programm. Monaden sind Typkonstruktoren.

Ein Typ Ersteller Cont<T> für Fortsetzungen Typ T wäre keine Monade.

Allerdings ist Cont<Cont<T>> eine Monade, und das ist, was gemeinhin als "Continuation Monad" bezeichnet wird.

(Mit callcc in einer Sprache entspricht Cont<Cont<T>>-T umwandeln zu können.)