Tutto il codice può essere rappresentato come una serie di operazioni Mappa / Filtro / Riduci?


16

Recentemente ho refactoring grossi blocchi di codice e li ho sostituiti con query Linq.

Rimozione del bias della lingua: Linq è essenzialmente un insieme di operazioni Mappa / Filtro e Riduci che operano su una sequenza di dati.

Questo mi ha fatto pensare, fino a dove teoricamente sarei in grado di portarlo. Sarei in grado di riscrivere l'intera base di codice in una serie (o anche una singola) di operazioni Mappa / Filtro e Riduci.

Sfortunatamente vengo pagato per fare cose utili, quindi non sono stato in grado di sperimentare molto di più, ma non riesco a pensare a nessuna struttura di codice che non possa essere ristrutturata come tale. Il codice con effetto laterale può essere gestito tramite monadi. Anche l'output essenzialmente sta mappando gli indirizzi di memoria sugli indirizzi dello schermo.

C'è qualcosa che non potrebbe essere (teoricamente) riscritto come una query Linq?



Ho sempre pensato che "ridurre" sia sufficiente per garantire il completamento di Turing (mappa e filtro possono essere implementati come operazioni di riduzione, no?) - almeno, l'equivalente linguistico funzionale di ridurre. Non so abbastanza su Linq per essere sicuro di quanto da vicino l'implementazione segua quella funzionale.
Blueberryfields

1
Non lo so, ma una regola empirica è che tutto ciò che qualcuno prenderebbe in considerazione la possibilità di scrivere tutto il proprio codice risulterà essere Turing completo. Ma il corollario di ciò è che essere Turing completo non è molto eccitante.
psr

1
Sono d'accordo con psr; Penso che una risposta valida a questa domanda debba affrontare la completezza di Turing. Una prova potrebbe tentare di implementare una macchina Turing usando solo queste operazioni.
Rob,

Pensiero inattivo: anche se permettiamo assurdità come my_list.map(_ignored => a copy of my_list), sembra che l'uso dello spazio di un tale programma sia limitato da un polinomio (a seconda della lunghezza del programma). Quindi un linguaggio del genere non potrebbe certamente calcolare problemi che non sono presenti in PSPACE. Tuttavia, poiché molti problemi in PSPACE sono considerati intrattabili, per non parlare di classi più grandi, questa potrebbe non essere una limitazione molto seria.

Risposte:


1

Si chiama programmazione funzionale ed è considerato da molti un concetto fondamentale. ecco una buona introduzione su Joel On Software . La risposta più tecnica è no, non esiste attualmente un modo noto di porre domande al computer (in un modo ben definito) a cui non è possibile rispondere tramite il calcolo SKI.


1
C'è molto di più per la programmazione funzionale che le funzioni map, filtere reduce(questo vale tre volte se ignoriamo la completezza turing e utilizziamo lingue pratici FP). In effetti, sembrano essere piuttosto generici e quindi generalmente utili, ma in realtà sono applicazioni molto semplici di programmazione funzionale. Il minimo calcolo lambda minimo può definire tali funzioni tra molte altre, non viceversa.

"Ecco una buona introduzione su Joel On Software", che riesce a confondere Fortran con Basic, quindi non mi fiderei di altri fatti.
quant_dev
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.