La teoria delle categorie è utile per l'apprendimento della programmazione funzionale?


118

Sto imparando Haskell e sono affascinato dalla lingua. Tuttavia non ho alcuna seria matematica o background CS. Ma sono un programmatore di software esperto.

Voglio imparare la teoria delle categorie in modo da poter diventare migliore in Haskell.

Quali argomenti nella teoria delle categorie dovrei imparare a fornire una buona base per comprendere Haskell?



1
Apprezzo che tu distingua programmazione e CS.
jmite,

4
"Imparare la teoria delle categorie per migliorare in Haskell" è un po 'come "Imparare la fisica per migliorare in tennis"
user26756,

Risposte:


115

In una precedente risposta nel sito teorico dell'informatica , ho affermato che la teoria delle categorie è la "base" per la teoria dei tipi. Qui, vorrei dire qualcosa di più forte. La teoria delle categorie è la teoria dei tipi . Al contrario, la teoria dei tipi è la teoria delle categorie . Vorrei espandere questi punti.

La teoria delle categorie è la teoria dei tipi

f:ABABf

ABf

La teoria dei tipi è teoria delle categorie

Per "teoria dei tipi" intendo qualsiasi tipo di linguaggio formale tipizzato, basato su rigide regole di formazione dei termini che assicurano che tutto il tipo controlli. Si scopre che, ogni volta che lavoriamo in un tale linguaggio, stiamo lavorando in una struttura teorica di categoria. Anche se usiamo le notazioni set-teoriche e pensiamo set-teoricamente, finiamo comunque per scrivere cose sensate dal punto di vista categorico. Questo è un fatto straordinario .

Storicamente, Dana Scott potrebbe essere stata la prima a rendersene conto. Ha lavorato alla produzione di modelli semantici di linguaggi di programmazione basati su calcoli lambda tipizzati (e non tipizzati). I modelli tradizionali di teoria degli insiemi erano inadeguati a questo scopo, poiché i linguaggi di programmazione implicano una ricorsione senza restrizioni, in cui la teoria manca. Scott ha inventato una serie di modelli semantici che hanno catturato i fenomeni di programmazione, e si è reso conto che il calcolo lambda tipizzato rappresentava esattamente una classe di categorie chiamate categorie chiuse cartesiane . Esistono molte categorie chiuse cartesiane che non sono "teoriche stabilite". Ma il calcolo lambda tipizzato si applica a tutti allo stesso modo. Scott ha scritto un bel saggio intitolato " Teorie correlate del calcolo lambda"Spiegare cosa sta succedendo, parti delle quali sembrano essere disponibili sul web. L'articolo originale è stato pubblicato in un volume intitolato" To HB Curry: Essays on Combinatory Logic, Lambda Calculus and Formalism ", Academic Press, 1980. Berry e Curien arrivò alla stessa realizzazione, probabilmente in modo indipendente: definirono una macchina astratta categorica (CAM) per usare queste idee nell'implementazione di linguaggi funzionali, e il linguaggio che implementarono fu chiamato "CAML" che è il quadro sottostante dell'F # di Microsoft .

×List Eilenberg e MacLaneproprio per formalizzare il concetto di funzioni polimorfiche. Li hanno chiamati "trasformazioni naturali", "naturali" perché sono le uniche che è possibile scrivere in modo corretto utilizzando le variabili di tipo. Quindi, si potrebbe dire che la teoria delle categorie è stata inventata proprio per formalizzare i linguaggi di programmazione polimorfici, anche prima che i linguaggi di programmazione fossero nati!

Un tradizionalista della teoria degli insiemi non ha conoscenza dei funzionali e delle trasformazioni naturali che avvengono sotto la superficie quando usa le notazioni della teoria degli insiemi. Ma, purché usi fedelmente il sistema dei tipi, sta davvero realizzando costruzioni categoriche senza esserne consapevole.


Detto questo, la teoria delle categorie è la teoria matematica per antonomasia dei tipi e delle funzioni. Pertanto, tutti i programmatori possono trarre vantaggio dall'apprendimento di un po 'di teoria delle categorie, in particolare i programmatori funzionali. Sfortunatamente, non sembrano esserci libri di testo sulla teoria delle categorie rivolti specificamente ai programmatori. I libri di "teoria delle categorie per l'informatica" sono generalmente rivolti a studenti / ricercatori di informatica teorica. Il libro di Benjamin Pierce, Teoria della categoria di base per gli informatici è forse il più leggibile.

Tuttavia, ci sono molte risorse sul web, destinate ai programmatori. La pagina di Haskellwiki può essere un buon punto di partenza. Alla Midlands Graduate School , abbiamo lezioni sulla teoria delle categorie (tra le altre). Il corso di Graham Hutton è stato ancorato come corso "principiante" e il mio è stato ancorato come corso "avanzato". Ma entrambi coprono essenzialmente lo stesso contenuto, andando a profondità diverse. L'Università di Chalmers ha una bella pagina di risorse su libri e appunti di conferenze in tutto il mondo. Il sito blog entusiasta di "sigfpe" offre anche molte buone intuizioni dal punto di vista del programmatore.

Gli argomenti di base che vorresti imparare sono:

  • definizione di categorie e alcuni esempi di categorie
  • funzioni e loro esempi
  • trasformazioni naturali e loro esempi
  • definizioni di prodotti, coprodotti ed esponenti (spazi funzionali), oggetti iniziali e terminali.
  • aggiunzioni
  • monadi, algebre e categorie di Kleisli

I miei appunti di lezione nella Midlands Graduate School coprono tutti questi argomenti tranne l'ultimo (monadi). Oggigiorno ci sono molte altre risorse disponibili per le monadi. Quindi non è una grande perdita.

Più matematica conosci, più facile sarebbe imparare la teoria delle categorie. Poiché la teoria delle categorie è una teoria generale delle strutture matematiche, è utile conoscere alcuni esempi per apprezzare il significato delle definizioni. (Quando ho imparato la teoria delle categorie, ho dovuto inventare i miei esempi usando la mia conoscenza della semantica del linguaggio di programmazione, perché i libri di testo standard avevano solo esempi matematici, di cui non sapevo nulla.) Poi è arrivato il brillante libro di Lambek e Scott chiamò " Introduzione alla logica categorica" che collegava la teoria delle categorie ai sistemi di tipo (ciò che chiamano "logica"). È ora possibile comprendere la teoria delle categorie semplicemente collegandola ai sistemi di tipo anche senza conoscere molti esempi. Molte delle risorse che ho menzionato sopra usano questo approccio per spiegare la teoria delle categorie.


3
@UdayReddy Non sono assolutamente d'accordo con la tua identificazione della teoria delle categorie con la teoria dei tipi. La moderna teoria dei tipi riguarda in modo sostanziale i tipi per i processi di concorrenza, ad esempio la tradizione teorica dei tipi di sessione. Per quanto ne so, non esiste una comprensione categorica di tali sistemi di battitura.
Martin Berger,

6
@MartinBerger Penso che la tua interpretazione della "teoria dei tipi" sia un po 'stretta. Tuttavia, sono d'accordo sul fatto che una corretta comprensione teorica dei tipi e delle categorie teoriche dei tipi di sessione sia attualmente una buona sfida di ricerca, su cui intendo trascorrere del tempo.
Uday Reddy,

2
@MartinBerger. Per vedere come la teoria delle categorie si applica alle nozioni più ricche di calcolo, vi invito a vedere come è stata applicata alla teoria della programmazione imperativa e alla semantica dei giochi (che di nuovo può codificare abbastanza bene i calcoli imperativi). Quindi, non credo che la programmazione funzionale abbia il monopolio della teoria delle categorie.
Uday Reddy,

1
f:PQfPQ

2
"Sfortunatamente, non sembrano esserci libri di testo sulla teoria delle categorie rivolti specificamente ai programmatori." Un simile "libro di testo" ora esiste più o meno nella teoria delle categorie per programmatori di Bartosz Milewski . Bartosz ha anche creato una serie di conferenze di accompagnamento .
alx9r

30

Proverò a mantenerlo breve e dolce. Esiste una corrispondenza informale tra i programmi Haskell e alcune classi di categorie, che può essere resa più formale con alcuni lavori. Questa corrispondenza è nota come corrispondenza Curry-Howard-Lambek e riguarda:

  1. Haskell digita con oggetti della categoria
  2. AB f:AB
  3. Tipi di dati algebrici con oggetti iniziali
  4. Costruttori di tipo con funtori
  5. eccetera

L'elenco potrebbe continuare all'infinito , ma un punto cruciale è che puoi definire cose come monadi e algebre nella teoria delle categorie e inventare nozioni che sono sia utili ai matematici ma anche pervasive nella pratica della programmazione di Haskell.

Non sono sicuro di quale libro raccomandare, poiché non ho trovato un libro introduttivo completamente soddisfacente sulle categorie per gli informatici. Puoi provare Categorie, Tipi e Strutture di Asperti e Longo. L'idea è di imparare le definizioni di base fino alle aggiunte, e quindi forse provare a leggere alcuni degli eccellenti blog là fuori per cercare di capire questi concetti.


1
"elaborare idee utili sia ai matematici, sia pervasive nella pratica della programmazione di Haskell" - puoi fare un esempio o richiederebbe troppe conoscenze preliminari?
Raffaello

7
@Raphael: Monads. Frecce. Algebras. Coalgebre.
Dave Clarke, l'

6
Functor, dualità, la categoria Kleisli, il lemma di Yoneda ...
cody

4
Cartesion categorie chiuse. Accattivarsi.
Dave Clarke,

2
"Un'introduzione alla teoria delle categorie per gli ingegneri del software", cs.toronto.edu/~sme/presentations/cat101.pdf
Vladimir Alexiev,

29

Facendo eco al consiglio di AJed, ti consiglio di girare la tua dichiarazione

I want to learn category theory so I can become better at Haskell.

sulla sua testa: impara Haskell, basandoti sulla tua intuizione di programmazione. Una volta che sei un guru del FP, potrebbe essere più facile raccogliere la teoria delle categorie (se ti interessa ancora).

La teoria delle categorie è semplice per qualcuno con una vasta educazione matematica (gruppi, anelli, moduli, spazi vettoriali, topologia ecc.). In mancanza di questo background, la teoria delle categorie è quasi impenetrabile. La bellezza della teoria delle categorie sta nel fatto che unifica molte cose apparentemente non correlate (ad es. Gli accostamenti di sinistra di funzioni dimenticanti includono gruppi liberi, algebre avvolgenti universali, compactificazioni Stone-Cech, abelianizzazioni di gruppi, ...) e quindi riduce la complessità. Ma se non hai familiarità con i molteplici esempi che la teoria delle categorie unifica, la teoria delle categorie è solo un ulteriore livello di complessità che ti rende la vita più difficile.

Nella mia esperienza, l'apprendimento è più semplice basandosi su cose che già si conoscono. Come sviluppatore di software, sai molto sulla programmazione e la programmazione di Haskell non è così diversa da altre programmazioni, quindi la mia raccomandazione è quella di affrontare Haskell da un punto di vista pragmatico della programmazione, ignorando la teoria delle categorie. La parte della teoria delle categorie che si trova in Haskell, ad esempio un po 'di supporto per le monadi, è molto più facile da comprendere per un programmatore senza fare una deviazione tramite la teoria delle categorie. Dopotutto, le monadi sono semplicemente una composizione generalizzata (e avrai già usato le monadi nella tua pratica di programmazione - anche se senza sapere che l'hai fatto), e Haskell non supporta realmente le monadi per davvero, in quanto non applica le leggi monadiche.


7
No, a dire il vero Haskell è davvero così diverso dalla maggior parte degli altri linguaggi di programmazione, al punto che superare le idee preconcette è spesso la sfida più grande. Gli sviluppatori di software esperti sembrano avere più problemi di quelli che non hanno mai programmato prima.
CA McCann,

5
@CAMcCann Concordo sul fatto che alcuni programmi esperti sembrano avere difficoltà a passare, ad esempio da Java o C # a Haskell, ma non penso che sia perché c'è qualcosa di fondamentalmente diverso in Haskell. Penso che sia in parte perché sembra essere diverso. L'idea che devi imparare la teoria delle categorie per apprezzare Haskell ha probabilmente impedito a molti sviluppatori software esperti di raggiungere la padronanza di Haskell. (Cfr. Perché F # non ha monadi.) Sicuramente trovo difficile pensare a molte funzionalità di Haskell che non hanno somiglianze in altre lingue.
Martin Berger,

5
Sapendo Teoria categoria potrebbe aiutare un po ', ma non più di tanto, e di apprendimento che è certamente molto più difficile che imparare Haskell. Ci sono differenze piuttosto fondamentali rispetto alla maggior parte delle lingue (purezza, valutazione non rigorosa, il sistema dei tipi) e la rimozione di tutti i termini CT non li rende più familiari. D'altra parte, l'apprendimento di Haskell motiva alcune persone ad imparare un po 'di CT, perché le idee prese in prestito sono utili . Il sistema di tipo limitato di F # e l'evitamento di un termine esistente perfettamente buono sono difetti, non caratteristiche.
CA McCann,

1
Non conosco lingue diverse da Scala con un sistema di tipi davvero paragonabile a quello di Haskell. Dall'osservazione empirica, la purezza non viene immediatamente colta e la valutazione non rigorosa (che hai ignorato) è ancora più difficile. Infine, sono un programmatore di lavoro e contendo che chiunque sul campo sarà intimidito da un nome . Il settore dello sviluppo software è già pieno di gergo opaco. Inoltre, il sistema di tipi di F # non può esprimere direttamente le monadi - le espressioni di calcolo non sono di prima classe, il che ne limita significativamente l'uso.
CA McCann,

2
CBN è anche concettualmente semplice, ad esempio per analogia con il thunking, un concetto che la maggior parte dei programmatori di lavoro avrebbe già usato. La purezza è qualcosa che ogni programmatore che lavora capisce. Haskell è utilizzato nell'istruzione universitaria nel Regno Unito. Quando i miei studenti mi chiedono come entrare nella programmazione funzionale, spesso raccomando di imparare prima Haskell, ma gli studenti sono intimiditi dalla sua reputazione, così come lo ha fatto la domanda. Credo che la ragione principale di ciò sia l'associazione di Haskell alla teoria delle categorie.
Martin Berger,

13

Una risposta breve: no [ma questa è solo un'opinione]

Non andare alla teoria delle categorie o qualsiasi altro dominio teorico per diventare bravo in Haskell. Impara tecniche di programmazione funzionale, come ricorsione della coda, mappa, riduzione e altro. Leggi più codice che puoi. Implementa quante più idee puoi. In caso di problemi, leggi e leggi.

Se vuoi un buon riferimento teorico per imparare Haskell e altri paradigmi di programmazione funzionale, dai un'occhiata a: Introduzione alla programmazione funzionale tramite Lambda Calculus, Greg Michaelson (disponibile online). ... Ci sono altri libri simili.


1
Sollevo un sopracciglio a questo, perché la "ricorsione della coda" di solito non è importante per la programmazione in Haskell a causa della pigrizia. Tuttavia, "imparare facendo" è quasi sempre un buon consiglio.
Dan Burton,

@DanBurton .. osservazione interessante. Diciamo quindi, invece di Haskell, imparare erlang o schema :). [Non sono un esperto di Haskell, l'ho scelto solo perché sembra bello]
AJed


0

La teoria delle categorie è un ramo molto sofisticato della matematica e padroneggiare unificherà la maggior parte dei tuoi apprendimenti precedenti rendendoli istanze di stessi oggetti astratti. Quindi è molto utile e molto intuitivo. Ma è vasto e vasto e ti ritroverai in molti nuovi concetti che non sapranno nemmeno quale sia adatto alle tue esigenze e quale dovresti saltare. Quindi il tuo approccio mirato ha bisogno di scelta tra concetti, altrimenti padroneggiarlo inevitabilmente ha bisogno di molto tempo e non è davvero un dominio di autoapprendimento.

A proposito, suggerisco un ottimo punto di partenza per il tuo scopo di essere qui .


Questo non risponde davvero alla domanda: è utile per l'apprendimento della programmazione funzionale? Quali argomenti nella teoria delle categorie sono utili per Haskell?
David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.