Jest to nieco niejasne, ale rachunek różniczkowy pojawia się w algebraicznych typach danych. Dla dowolnego typu typ kontekstów z jednym otworem jest pochodną tego typu. Zobacz tę doskonałą rozmowę, aby uzyskać przegląd całego tematu. To bardzo techniczna terminologia, więc wyjaśnijmy.
Algebraiczne typy danych
Być może natrafiłeś na krotki określane jako typy produktów (jeśli nie, to dlatego, że są to kartezjańskie produkty dwóch rodzajów). Przyjmiemy to dosłownie i użyjemy zapisu:
a∗b
Do reprezentowania krotki, gdzie i są oba typy. Następnie możesz natknąć się na typy sum, są to typy, które mogą być albo jednym rodzajem, albo drugim (znanym jako związki , warianty lub jako oba typy (rodzaj) w Haskell). Weźmiemy to również dosłownie i użyjemy zapisu:ab
a+b
Są one nazywane jakimi są, ponieważ jeśli typ ma wartości , a typ ma wartości , to typ ma wartości .aNabNba+bNa+Nb
Te typy wyglądają jak normalne wyrażenia algebraiczne i możemy w rzeczywistości nimi manipulować (do pewnego stopnia).
Przykład
W językach funkcjonalnych powszechną definicją listy (podaną tutaj w Haskell) jest:
data List a = Empty
| Cons a List
Oznacza to, że lista jest pusta lub krotka wartości i inna lista. Przekształcając to w notację algebraiczną, otrzymujemy:
L(a)=1+a∗L(a)
Gdzie oznacza typ o jednej wartości (inaczej typ jednostki). Przez wielokrotne wstawianie możemy to ocenić, aby uzyskać definicję :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...
(Gdzie oznacza wielokrotne mnożenie).xn
Ta definicja mówi wtedy, że lista jest albo jednostką, albo krotką jednego elementu, albo krotką dwóch elementów, albo trzech itd., Co jest definicją listy!
Konteksty z jednym otworem
Przejdźmy teraz do kontekstów z jednym dołkiem: kontekst z jednym dołkiem jest tym, co dostajesz, gdy „bierzesz wartość” z rodzaju produktu. Podajmy przykład:
Dla prostego 2-krotek, który jest jednorodny, , jeśli weźmiemy wartość, otrzymamy po prostu 1-krotkę, . Istnieją jednak dwa różne konteksty z jednym otworem tego typu: mianowicie pierwsza i druga wartość krotki. Skoro jest to którykolwiek z nich, moglibyśmy napisać, że jest , czyli oczywiście . Tutaj właśnie pojawia się zróżnicowanie. Potwierdźmy to innym przykładem:a2aa+a2a
Wyciągnięcie wartości z 3-krotek daje 2-krotkę, ale istnieją trzy różne warianty:
(a,a,_)
(a,_,a)
(_,a,a)
W zależności od tego, gdzie umieszczamy otwór. To daje nam która jest rzeczywiście pochodną . Jest dowodem na to w ogóle tutaj .3a2a3
W naszym ostatnim przykładzie użyjmy listy:
Jeśli weźmiemy nasze oryginalne wyrażenie na listę:
L(a)=1+a∗L(a)
Możemy zmienić układ, aby uzyskać:
L(a)=11−a
(Na pierwszy rzut oka może to wydawać się nonsensem, ale jeśli weźmiesz serię Taylor tego wyniku, otrzymasz definicję, którą wyprowadziliśmy wcześniej.)
Jeśli to rozróżnimy, otrzymamy ciekawy wynik:
∂L(a)∂a=(L(a))2
Tak więc jedna lista stała się parą list. Ma to w rzeczywistości sens: dwie wytworzone listy odpowiadają elementom powyżej i poniżej dziury na oryginalnej liście!