Ciò è alquanto oscuro, ma il calcolo si presenta in tipi di dati algebrici. Per ogni dato tipo, il tipo dei suoi contesti a un foro è la derivata di quel tipo. Guarda questo eccellente discorso per una panoramica dell'intera materia. Questa è una terminologia molto tecnica, quindi spieghiamo.
Tipi di dati algebrici
Potresti esserti imbattuto in tuple indicate come tipi di prodotto (in caso contrario, è perché sono il prodotto cartesiano di due tipi). Lo prenderemo alla lettera e useremo la notazione:
a∗b
Per rappresentare una tupla, dove e b sono entrambi i tipi. Successivamente, potresti esserti imbattuto in tipi di somma che sono tipi che possono essere di un tipo o di un altro (noti come unioni , varianti o come entrambi i tipi (kinda) in Haskell). Prenderemo anche questo alla lettera e useremo la notazione:ab
a+b
Questi sono nominati come sono perché se un tipo ha valori N a e un tipo b ha valori N b , il tipo a + b ha valori N a + N b .aNabNba+bNa+Nb
Questi tipi sembrano normali espressioni algebriche e possiamo, in effetti, manipolarli come tali (fino a un certo punto).
Un esempio
Nei linguaggi funzionali una definizione comune di un elenco (fornita in Haskell qui) è questa:
data List a = Empty
| Cons a List
Ciò dice che un elenco è vuoto o una tupla di un valore e un altro elenco. Trasformandolo in notazione algebrica, otteniamo:
L(a)=1+a∗L(a)
Dove rappresenta un tipo con un valore (ovvero il tipo di unità). Inserendo ripetutamente, possiamo valutare questo per ottenere una definizione per L ( a ) :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...
xn
Questa definizione dice quindi che un elenco è o unità, o una tupla di un elemento, o una tupla di due elementi, o di tre ecc., Che è la definizione di un elenco!
Contesti a un foro
Passiamo ora ai contesti a un buco: un contesto a un buco è ciò che ottieni quando "estrai un valore" da un tipo di prodotto. Facciamo un esempio:
a2aa+a2a
Prendere un valore da una 3-tupla dà una 2-tupla, ma ci sono tre diverse varianti:
(a,a,_)
(a,_,a)
(_,a,a)
3a2a3
Per il nostro esempio finale, usiamo un elenco:
Se prendiamo la nostra espressione originale per un elenco:
L(a)=1+a∗L(a)
Possiamo riorganizzare per ottenere:
L(a)=11−a
(In apparenza può sembrare una sciocchezza, ma se prendi la serie di taylor di questo risultato otterrai la definizione che abbiamo derivato in precedenza.)
Ora, se differenziamo questo, otteniamo un risultato interessante:
∂L(a)∂a=(L(a))2
Quindi una lista è diventata una coppia di liste. Questo in effetti ha senso: le due liste prodotte corrispondono agli elementi sopra e sotto il buco nella lista originale!