Continuation passant la transformation des fonctions binaires

13

Rappelons la transformation de passage de continuation (transformée CPS) qui prend à β A : = R R A (où R est fixe) et f : A B à β f : β A β B défini par βUNEβUNE:=RRUNERF:UNEBβF:βUNEβB En fait, nous avons lamonade de continuationavec l'unité η A : A β A définie par η A x : = λ r . r

βFκr:=κ(rF).
ηUNE:UNEβUNE et la multiplication μ A : β ( β A ) β A définie par μ A
ηUNEX:=λr.rX
μUNE:β(βUNE)βUNE
μUNEKr:=K(λF.Fr).

Maintenant , nous allons réfléchir à la façon dont nous pouvons transformer un binaire carte , par exemple, nous voulons γ f : β A β B β C . On arrive rapidement avec γF:UNEBCγF:βUNEβBβC Cela est également logique du point de vue de la programmation.

γFκνr:=κ(λX.β(FX)νr).

Voici ma question: y a-t-il une raison plus profonde pour , autre que le fait qu'il semble juste du point de vue de la programmation? Par exemple, y a-t-il une raison théorique ou autre «théorique» pour penser que γ a un sens? Par exemple, pouvons-nous faire cuire γ de la monade de manière systématique?γγγ

Je cherche un aperçu des transformations CPS des fonctions -ary.n

Andrej Bauer
la source
2
Cherchez-vous quelque chose au-delà de Haskell liftM2ou des généralisations Applicative? Vous pouvez dériver une version n-aire de ce que vous décrivez (dans un langage qui vous permet de parler des fonctions polymorphes n-aire) directement à partir de la structure applicative de continuation.
copumpkin
1
Je sais écrire ces généralisations, je veux savoir pourquoi elles sont comme ça. Les théoriciens des catégories comprendront ce que je demande.
Andrej Bauer
1
Hmm, merci d'avoir souligné Applicative. Il a liftA2qui est mon , voir hackage.haskell.org/packages/archive/base/4.2.0.0/doc/html/…γ
Andrej Bauer
3
Oui, cela liftA2faisait partie de ce que je proposais. La notion de "parenthèse idiomatique" (se (| f x y z ... |)traduit par pure f <*> x <*> y <*> z <*> ...) de Applicativesemble être le moyen systématique d'obtenir la forme n-aire de votre question. Je connais le CT, mais il m'a semblé plus simple d'en parler en termes de programmation standard. Si vous ne l'aviez pas rencontré Applicativeauparavant, vous voudrez peut-être examiner les foncteurs monoïdes laxistes (bien que la déclaration de Haskell à ce sujet <*>implique également des exponentielles). Quoi qu'il en soit, je n'ai pas de réponse pour vous mais j'essayais de mieux comprendre où vous vouliez en venir :)
copumpkin
2
La thèse de Hayo Thielecke porte sur la structure catégorielle du CPS. Peut-être que la réponse se trouve là ou dans ses autres publications. cs.bham.ac.uk/~hxt/research/hayo-thielecke-publications.shtml
Dave Clarke

Réponses:

7

~~ A * ~~ B | - ~~ (A * B)

¬¬UNE¬¬B¬¬(UNEB)

κϵ

Noam Zeilberger
la source
4

Augmenter la réponse de Noam:

F:UNEBCuncurry(F):UNE×BCTblstr:TUNE×TBT(UNE×B)

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

If we instantiate this to the continuation monad, we obtain your construction.

Généralisation à n-variables, the following should work (I didn't check all the details through).

Une fois que nous avons choisi une permutation π plus de n, nous avons un π-morphisme de force strπ:TUNE1××TUNEnT(UNE1××UNEn). (Les lois de la monade devraient garantir que la façon dont nous associons cette permutation importe peu.) Par conséquent, pour chaquenmorphisme -ary F:UNE1××UNEnC, on peut construire: γF:TUNE1××TUNEnstrπT(UNE1××UNEn)TFTC.

Mais je ne pense toujours pas que cela vous donne vraiment la réponse que vous cherchez ...

Ohad Kammar
la source