Pergunta sobre subtipagem de manipuladores em "Um sistema de efeitos para efeitos e manipuladores algébricos"

8

Eu tinha uma pergunta sobre subtipagem no artigo "Um sistema de efeitos para efeitos e manipuladores algébricos" . Eu queria saber por que não há uma regra de subtipagem para adicionar efeitos nos dois lados de um tipo de manipulador, algo como isto:

T!AR!BT!(AC)R!(BC)

Isso seria útil ao aplicar uma variável com um tipo de manipulador a um cálculo com mais efeitos do que o tipo de manipulador no lado esquerdo.

Você pode adicionar efeitos aos dois lados de um tipo de manipulador usando a regra de digitação para manipuladores, mas isso não funcionará para variáveis. Por exemplo, quando o manipulador é um argumento para uma função.

Labbekak
fonte

Respostas:

9

Estou surpreso que não recebamos essa pergunta com mais frequência, pois Andrej e eu consideramos adicionar essa regra por algum tempo e acreditamos ter provado sua exatidão. Mas, no final, acabou sendo falso, pelo menos em uma configuração de chamada por valor (eu ouvi dizer que ela é mais agradável no valor de chamada por push).

BAAB

B!{lookup,update}(AB!)!
Observe os dois conjuntos vazios no lado direito. O primeiro afirma que a função resultante é pura, o segundo que não há efeitos ao produzir essa função.

Δlookupupdate

B!({lookup,update}Δ)(AB!)!Δ
B!({lookup,update}Δ)(AB!Δ)!Δ
Δ
Matija Pretnar
fonte
1
Obrigado Matija! Como você se safa por não ter essa regra? Como você pode aplicar o manipulador de estado (quando não está embutido) a um cálculo que tem mais efeitos do que apenas pesquisar e atualizar? Eu acho que você teria que alinhar todos os manipuladores?
Labbekak
1
A,B,Δ.B!({lookup,update}Δ)(AB!Δ)!Δ