Isso é um tanto obscuro, mas o cálculo aparece nos tipos de dados algébricos. Para qualquer tipo, o tipo de seus contextos de um furo é a derivada desse tipo. Veja esta excelente palestra para uma visão geral de todo o assunto. Esta é uma terminologia muito técnica, então vamos explicar.
Tipos de dados algébricos
Você pode ter encontrado tuplas sendo chamadas de tipos de produtos (se não, é porque são produtos cartesianos de dois tipos). Vamos entender isso literalmente e usar a notação:
a∗b
Para representar uma tupla, onde e são os dois tipos. Em seguida, você pode se deparar com tipos de soma, tipos que podem ser de um tipo ou de outro (conhecido como uniões , variantes ou como o tipo Either (meio que) em Haskell). Também vamos levar este literalmente e usar a notação:ab
a+b
Eles são nomeados como são porque, se um tipo possui valores e um tipo possui valores , o tipo possui valores .aNabNba+bNa+Nb
Esses tipos parecem expressões algébricas normais e podemos, de fato, manipulá-las como tal (até certo ponto).
Um exemplo
Nas linguagens funcionais, uma definição comum de uma lista (fornecida aqui em Haskell) é a seguinte:
data List a = Empty
| Cons a List
Isso indica que uma lista está vazia ou uma tupla de um valor e outra lista. Transformando isso em notação algébrica, obtemos:
L(a)=1+a∗L(a)
Onde representa um tipo com um valor (também conhecido como tipo de unidade). Ao inserir repetidamente, podemos avaliar isso para obter uma definição para :1L(a)
L(a)=1+a∗L(a)
L(a)=1+a∗(1+a∗L(a))
L(a)=1+a+a2∗(1+a∗L(a))
L(a)=1+a+a2+a3∗(1+a∗L(a))
L(a)=1+a+a2+a3+a4+a5...
(Onde se entende no sentido de multiplicação repetida.)xn
Esta definição diz então que uma lista é uma unidade, ou uma tupla de um item, ou uma tupla de dois itens, ou de três etc, que é a definição de uma lista!
Contextos de um buraco
Agora, para contextos de um orifício: um contexto de um orifício é o que você obtém quando 'extrai um valor' de um tipo de produto. Vamos dar um exemplo:
Para uma simples tupla de 2 que é homogênea, , se extrairmos um valor, obtemos apenas uma tupla de 1, . Mas existem dois contextos de um buraco diferentes desse tipo: o primeiro e o segundo valores da tupla. Então, como é um desses, poderíamos escrever que é , que é, é claro, . É aqui que a diferenciação entra em cena. Vamos confirmar isso com outro exemplo:a2aa+a2a
Tirar um valor de uma tupla de três fornece uma dupla de duas, mas existem três variantes diferentes:
(a,a,_)
(a,_,a)
(_,a,a)
Dependendo de onde colocamos o buraco. Isso nos dá que é de fato a derivada de . Há uma prova disso em geral aqui .3a2a3
Para o nosso exemplo final, vamos usar uma lista:
Se levarmos nossa expressão original para uma lista:
L(a)=1+a∗L(a)
Podemos reorganizar para obter:
L(a)=11−a
(Na superfície, isso pode parecer absurdo, mas se você considerar a série taylor desse resultado, obterá a definição que derivamos anteriormente.)
Agora, se diferenciarmos, obtemos um resultado interessante:
∂L(a)∂a=(L(a))2
Assim, uma lista se tornou um par de listas. Isso de fato faz sentido: as duas listas produzidas correspondem aos elementos acima e abaixo do furo na lista original!