Transformação de passagem contínua de funções binárias

13

Lembre-se da transformação de passagem de continuação (transformação CPS) que leva para β A : = R R A (onde R é fixo) ef : A B para β f : β A β B definida por βUMAβUMA:=RRUMARf:UMABβf:βUMAβB De fato, temos amônada de continuaçãocom a unidade η A : A β A definida por η A x : = λ r . r

βfκr:=κ(rf).
ηUMA:UMAβUMA e a multiplicação μ A : β ( β A ) β A definida por μ A
ηUMAx:=λr.rx
μUMA:β(βUMA)βUMA
μUMAKr:=K(λf.fr).

Agora vamos pensar sobre como podemos transformar um binário mapa , ou seja, queremos γ f : β A β B β C . Um rapidamente aparece com γf:UMABCγf:βUMAβBβC Isso também faz sentido do ponto de vista da programação.

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

Aqui está minha pergunta: existe uma razão mais profunda para , além do fato de parecer correto do ponto de vista da programação? Por exemplo, existe uma razão teórica por categoria ou outra razão "teórica" ​​para pensar que γ faz sentido? Por exemplo, podemos preparar γ da mônada de maneira sistemática?γγγ

Eu estou procurando uma visão sobre transformações CPS de funções.n

Andrej Bauer
fonte
2
Você está procurando algo além de Haskell liftM2ou generalizações Applicative? Você pode derivar uma versão n-ária do que descreve (em um idioma que permite falar sobre funções polimórficas n-árias) diretamente da estrutura do aplicativo de continuação.
Copumpkin
1
Eu sei como escrever essas generalizações, quero saber por que elas são assim. Os teóricos das categorias entenderão o que estou perguntando.
Andrej Bauer
1
Hmm, obrigado por apontar Applicative. Possui liftA2qual é o meu , consulte hackage.haskell.org/packages/archive/base/4.2.0.0/doc/html/…γ
Andrej Bauer
3
Sim, liftA2fazia parte do que eu estava sugerindo. A noção de "suporte de idioma" ( (| f x y z ... |)traduz para pure f <*> x <*> y <*> z <*> ...) de Applicativeparece ser a maneira sistemática de obter a forma n-ária da sua pergunta. Eu conheço o CT, mas parecia mais simples falar sobre isso em termos de programação padrão. Se você não se deparou Applicativeantes, pode querer olhar para os funcionadores monoidais relaxados (embora a declaração de Haskell sobre isso <*>envolva exponenciais também). Enfim, eu não tenho uma resposta para você, mas estava tentando entender melhor o que estava recebendo :)
copumpkin
2
A tese de doutorado de Hayo Thielecke é sobre a estrutura categórica do CPS. Talvez a resposta esteja lá ou em suas outras publicações. cs.bham.ac.uk/~hxt/research/hayo-thielecke-publications.shtml
Dave Clarke

Respostas:

7

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

¬¬UMA¬¬B¬¬(UMAB)

κϵ

Noam Zeilberger
fonte
4

Aumentando a resposta de Noam:

f:UMABCvocêncvocêrry(f):UMA×BCTdbeustr:TUMA×TBT(UMA×B)

TUMA×TBdbeustrT(UMA×B)vocêncvocêrry(f)TC

Se instanciamos isso na mônada de continuação, obtemos sua construção.

n

πnπstrπ:TUMA1××TUMAnT(UMA1××UMAn)nf:UMA1××UMAnCγf:TUMA1××TUMAnstrπT(UMA1××UMAn)TfTC

Mas ainda não acho que isso realmente lhe dê a resposta que você está procurando ...

Ohad Kammar
fonte