Fortsetzung der Transformation von Binärfunktionen

13

Erinnern Sie sich an die Continuation-Passing-Transformation (CPS-Transformation), die nach (wobei festgelegt ist) und nach definiert durch In der Tat haben wir die Fortsetzung monadisch mit der Einheit definiert durch \ eta_A x \ mathrel {{:} {}} = \ lambda r. r \, x und die Multiplikation \ mu_A: \ beta (\ beta A) \ zu \ beta A definiert durch \ mu_A \, K \, r \ mathrel {{:} {=}} K (\ lambda f. f \ , r).β A : = R R A R f : A B β f : β A β B βAβA:=RRARf:ABβf:βAβB

βfκr:=κ(rf).
η A x : = λ r . rηA:AβAμ A : β ( β A ) β A μ A
ηAx:=λr.rx
μA:β(βA)βA
μAKr:=K(λf.fr).

Nun lassen Sie uns darüber nachdenken , wie wir eine transformieren können binäre Karte , das heißt, wir wollen . Man findet schnell Dies ist auch aus programmtechnischer Sicht sinnvoll.f:ABCγf:βAβBβC

γfκνr:=κ(λx.β(fx)νr).

Hier ist meine Frage: Gibt es einen tieferen Grund für als die Tatsache, dass es vom Standpunkt der Programmierung aus richtig aussieht? Gibt es zum Beispiel einen kategorietheoretischen oder einen anderen "theoretischen" Grund für die Annahme, dass sinnvoll ist? Können wir zum Beispiel auf systematische Weise aus der Monade aufbereiten?γγγ

Ich suche nach einem Einblick in CPS-Transformationen von Funktionen.n

Andrej Bauer
quelle
2
Suchen Sie etwas jenseits von Haskells liftM2oder Verallgemeinerungen Applicative? Sie können eine n-fache Version Ihrer Beschreibung (in einer Sprache, in der Sie über n-fache polymorphe Funktionen sprechen können) direkt aus der anwendbaren Folgestruktur ableiten.
Copumpkin
1
Ich weiß, wie man diese Verallgemeinerungen schreibt, ich möchte wissen, warum sie so sind. Kategorietheoretiker werden verstehen, was ich frage.
Andrej Bauer
1
Hmm, danke für den Hinweis Applicative. Es hat liftA2was ist mein , siehe hackage.haskell.org/packages/archive/base/4.2.0.0/doc/html/…γ
Andrej Bauer
3
Ja, liftA2war ein Teil dessen, was ich vorschlug. Der Begriff "Redewendung" ( (| f x y z ... |)übersetzt auf pure f <*> x <*> y <*> z <*> ...) aus Applicativescheint der systematische Weg zu sein, um die n-äre Form Ihrer Frage zu erhalten. Ich kenne die CT, aber es schien am einfachsten, in Standard-Programmierbegriffen darüber zu sprechen. Wenn Sie vorher nicht vorgekommen Applicativewären, könnten Sie sich nach laxen monoiden Funktoren umsehen (obwohl Haskells Aussage <*>auch Exponentiale beinhaltet). Wie auch immer, ich habe keine Antwort für dich, aber ich habe versucht besser zu verstehen, worauf du hinaus willst :)
copumpkin
2
Hayo Thieleckes Doktorarbeit befasst sich mit der kategorialen Struktur von CPS. Vielleicht liegt die Antwort dort oder in seinen anderen Veröffentlichungen. cs.bham.ac.uk/~hxt/research/hayo-thielecke-publications.shtml
Dave Clarke

Antworten:

7

Die nächstgelegene ich auf diese Frage eine Antwort gesehen habe , ist das erste Bild in der Galerie des Doktor Mellies , ~~ A * ~~ B | - ~~ (A * B) welche die Karte , die in jedem existiert Dialog Kategorie (dh eine monoide Kategorie mit Abschlüssen in ein festes Objekt). Beachten Sie, dass sich die CPS-Transformation von links nach rechts für allgemeine Binärfunktionen darauf reduziert, diese Map anzuwenden und dann mit der Funktionsaktion der Monade mit doppelter Negation zu komponieren.

¬¬A¬¬B¬¬(AB)

κϵ

Noam Zeilberger
quelle
4

Die Antwort von Noam erweitern:

f:ABCuncurry(f):A×BCTdblstr:TA×TBT(A×B)

TA×TBdblstrT(A×B)uncurry(f)TC

Wenn wir dies zur Folgemonade instanziieren, erhalten wir Ihre Konstruktion.

n

πnπstrπ:TA1××TAnT(A1××An)nf:A1××AnCγf:TA1××TAnstrπT(A1××An)TfTC

Aber ich glaube immer noch nicht, dass dies wirklich die Antwort gibt, nach der Sie suchen ...

Ohad Kammar
quelle