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 β En fait, nous avons lamonade de continuationavec l'unité η A : A → β A définie par η A x : = λ r . r
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 γ Cela est également logique du point de vue de la programmation.
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.
la source
liftM2
ou des généralisationsApplicative
? 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.Applicative
. Il aliftA2
qui est mon , voir hackage.haskell.org/packages/archive/base/4.2.0.0/doc/html/…liftA2
faisait partie de ce que je proposais. La notion de "parenthèse idiomatique" (se(| f x y z ... |)
traduit parpure f <*> x <*> y <*> z <*> ...
) deApplicative
semble ê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éApplicative
auparavant, 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 :)Réponses:
la source
Augmenter la réponse de Noam:
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 s t rπ:TUNE1× ⋯ ×TUNEn→T(A1× ⋯ ×An) . (Les lois de la monade devraient garantir que la façon dont nous associons cette permutation importe peu.) Par conséquent, pour chaquen morphisme -ary F: A1× ⋯ × An→ C , on peut construire:
γF: TUNE1× ⋯ × TUNEn-→-s t rπT( A1× ⋯ × An) -→TFTC .
Mais je ne pense toujours pas que cela vous donne vraiment la réponse que vous cherchez ...
la source