Esto es algo oscuro, pero el cálculo aparece en tipos de datos algebraicos. Para cualquier tipo dado, el tipo de sus contextos de un agujero es la derivada de ese tipo. Vea esta excelente charla para una visión general de todo el tema. Esta es una terminología muy técnica, así que expliquemos.
Tipos de datos algebraicos
Es posible que haya encontrado tuplas que se conocen como tipos de productos (si no, es porque son el producto cartesiano de dos tipos). Vamos a tomar esto literalmente y usar la notación:
a∗b
Para representar una tupla, donde y son ambos tipos. A continuación, es posible que haya encontrado tipos de suma, estos son tipos que pueden ser de un tipo u otro (conocidos como uniones , variantes o como el tipo Cualquiera (un poco) en Haskell). También vamos a tomar esto literalmente y usar la notación:ab
a+b
Estos se nombran tal como están porque si un tipo tiene valores y un tipo tiene valores , entonces el tipo tiene valores .aNabNba+bNa+Nb
Estos tipos parecen expresiones algebraicas normales y, de hecho, podemos manipularlos como tales (hasta cierto punto).
Un ejemplo
En los lenguajes funcionales, una definición común de una lista (dada en Haskell aquí) es esta:
data List a = Empty
| Cons a List
Esto dice que una lista está vacía o una tupla de un valor y otra lista. Transformando eso a notación algebraica, obtenemos:
L(a)=1+a∗L(a)
Donde representa un tipo con un valor (también conocido como el tipo de unidad). Al insertar repetidamente, podemos evaluar esto para obtener una definición de :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...
(Donde se entiende en el sentido de multiplicación repetida).xn
¡Esta definición dice que una lista es una unidad, o una tupla de un elemento, o una tupla de dos elementos, o de tres, etc., que es la definición de una lista!
Contextos de un agujero
Ahora en contextos de un agujero: un contexto de un agujero es lo que obtienes cuando 'sacas un valor' de un tipo de producto. Pongamos un ejemplo:
Para una simple 2-tupla que es homogénea, , si sacamos un valor, solo obtenemos una 1-tupla, . Pero hay dos contextos de un agujero diferentes de este tipo: a saber, el primer y el segundo valor de la tupla. Entonces, como es cualquiera de estos, podríamos escribir que es , que es, por supuesto, . Aquí es donde entra en juego la diferenciación. Confirmemos esto con otro ejemplo:a2aa+a2a
Sacar un valor de una tupla de 3 da una tupla de 2, pero hay tres variantes diferentes:
( a , _ , a ) ( _ , a , a )
(a,a,_)
(a,_,a)
(_,a,a)
Dependiendo de dónde ponemos el agujero. Esto nos da que de hecho es la derivada de . Hay una prueba de esto en general aquí .a 33a2a3
Para nuestro ejemplo final, usemos una lista:
Si tomamos nuestra expresión original para una lista:
L(a)=1+a∗L(a)
Podemos reorganizar para obtener:
L(a)=11−a
(En la superficie, esto puede parecer una tontería, pero si toma la serie taylor de este resultado, obtiene la definición que obtuvimos anteriormente).
Ahora, si diferenciamos esto, obtenemos un resultado interesante:
∂L(a)∂a=(L(a))2
Así, una lista se ha convertido en un par de listas. De hecho, esto tiene sentido: ¡las dos listas producidas corresponden a los elementos arriba y debajo del agujero en la lista original!