Dies ist etwas unklar, aber in algebraischen Datentypen taucht Kalkül auf. Für jeden gegebenen Typ ist der Typ seiner Ein-Loch-Kontexte die Ableitung dieses Typs. Sehen Sie sich diesen ausgezeichneten Vortrag an, um einen Überblick über das gesamte Thema zu erhalten. Dies ist eine sehr technische Terminologie.
Algebraische Datentypen
Möglicherweise sind Sie auf Tupel gestoßen, die als Produkttypen bezeichnet werden (andernfalls handelt es sich um das kartesische Produkt zweier Typen). Wir werden dies wörtlich nehmen und die Notation verwenden:
a∗b
Ein Tupel darstellen, wobei und beide Typen sind. Als nächstes sind Sie möglicherweise auf Summentypen gestoßen. Dies sind Typen, die entweder der eine oder der andere Typ sein können (in Haskell als " Gewerkschaften" , " Varianten" oder als " Entweder " (irgendwie) bezeichnet). Wir werden diesen auch wörtlich nehmen und die Notation verwenden:ab
a+b
Diese werden genannt , wie sie sind , weil , wenn ein Typ hat Werte und einen Typ hat Werte, wird der Typ hat Werte.aNabNba+bNa+Nb
Diese Typen sehen aus wie normale algebraische Ausdrücke, und wir können sie tatsächlich als solche (bis zu einem gewissen Punkt) manipulieren.
Ein Beispiel
In funktionalen Sprachen lautet eine gebräuchliche Definition einer Liste (in Haskell hier angegeben) wie folgt:
data List a = Empty
| Cons a List
Dies besagt, dass eine Liste entweder leer ist oder ein Tupel aus einem Wert und einer anderen Liste. Wenn wir das in algebraische Notation umwandeln, erhalten wir:
L(a)=1+a∗L(a)
Wobei einen Typ mit einem Wert darstellt (auch bekannt als Einheitentyp). Durch wiederholtes Einfügen können wir dies auswerten, um eine Definition für :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...
(Wobei im Sinne einer wiederholten Multiplikation gemeint ist.)xn
Diese Definition sagt dann , dass eine Liste entweder Einheit ist, oder ein Tupel von einem Punkt oder ein Tupel aus zwei Elementen, oder von drei usw., die ist die Definition einer Liste!
Ein-Loch-Kontexte
Nun zu Ein-Loch-Kontexten: Ein Ein-Loch-Kontext ist das, was Sie erhalten, wenn Sie einem Produkttyp einen Wert entnehmen. Nennen wir ein Beispiel:
Für ein einfaches 2-Tupel, das homogen ist, , wenn wir einen Wert herausnehmen, erhalten wir nur ein 1-Tupel, . Es gibt jedoch zwei verschiedene Ein-Loch-Kontexte dieses Typs: den ersten und den zweiten Wert des Tupels. Da es sich also um eines von beiden handelt, können wir schreiben, dass es , was natürlich . Hier kommt die Differenzierung ins Spiel. Lassen Sie uns dies mit einem anderen Beispiel bestätigen:a2aa+a2a
Wenn Sie einen Wert aus einem 3-Tupel nehmen, erhalten Sie ein 2-Tupel, aber es gibt drei verschiedene Varianten:
( a , _ , a ) ( _ , a , a )
(a,a,_)
(a,_,a)
(_,a,a)
Je nachdem, wo wir das Loch setzen. Dies ergibt was in der Tat die Ableitung von . Dafür gibt es hier generell einen Beweis .a 33a2a3
Für unser letztes Beispiel verwenden wir eine Liste:
Wenn wir unseren ursprünglichen Ausdruck für eine Liste nehmen:
L(a)=1+a∗L(a)
Wir können neu arrangieren, um Folgendes zu erhalten:
L(a)=11−a
(Auf den ersten Blick mag dies unsinnig erscheinen, aber wenn Sie die Taylor-Reihe dieses Ergebnisses nehmen, erhalten Sie die Definition, die wir zuvor abgeleitet haben.)
Wenn wir dies nun differenzieren, erhalten wir ein interessantes Ergebnis:
∂L(a)∂a=(L(a))2
So ist eine Liste zu einem Listenpaar geworden. Dies ist in der Tat sinnvoll: Die beiden erstellten Listen entsprechen den Elementen oberhalb und unterhalb des Lochs in der Originalliste!