Domanda

Per tutte le persone che conoscono lambda calculus : Quali vantaggi ti ha procurato, per quanto riguarda la programmazione ? Consiglieresti alle persone di impararlo?

È stato utile?

Soluzione

Se vuoi programmare in qualsiasi linguaggio di programmazione funzionale , è essenziale. Voglio dire, quanto è utile sapere sulle macchine di Turing? Bene, se scrivi C, il paradigma del linguaggio è abbastanza vicino alle macchine di Turing - hai un puntatore a un'istruzione e un'istruzione corrente, e la macchina intraprende qualche azione nello stato corrente, quindi si sposta lungo l'istruzione successiva.

In un linguaggio funzionale, semplicemente non puoi pensare così - non è il paradigma del linguaggio. Devi ripensare al calcolo lambda e come vengono valutati i termini lì. Sarà molto più difficile per te essere efficace in un linguaggio funzionale se non conosci il calcolo lambda.

Altri suggerimenti

Il vantaggio del calcolo lambda è che si tratta di un modello di calcolo estremamente semplice equivalente a una macchina di Turing. Ma mentre una macchina di Turing è più simile al linguaggio assembly, il calcolo lambda è più simile a un linguaggio di alto livello. E se impari codifiche della Chiesa che ti aiuteranno a imparare la tecnica di programmazione chiamata stile di passaggio di continuazione , che è molto utile per implementare la ricerca di backtracking e altri trucchi accurati.

L'uso principale del calcolo lambda nella pratica è che è un ottimo strumento di laboratorio per lo studio di nuove idee per il linguaggio di programmazione . Se hai un'idea per una nuova funzione linguistica, puoi aggiungere la nuova funzione al calcolo lambda e otterrai qualcosa che è abbastanza espressivo da programmare pur essendo abbastanza semplice da studiare a fondo . Questo uso è molto più per i progettisti e teorici del linguaggio che per i programmatori.

Il calcolo Lambda è anche molto interessante di per sé: proprio come conoscere il linguaggio assembly, approfondirà la tua comprensione del calcolo . È particolarmente divertente programmare una macchina turing universale nel calcolo lambda. Ma questa è matematica di base, non programmazione pratica.

Ad essere sincero, apprendere il calcolo lambda prima della programmazione funzionale mi ha fatto capire che i due non sono correlati come C è con qualsiasi programmazione imperativa.

Il calcolo lambda è un linguaggio di programmazione funzionale, un linguaggio esoterico, se lo desideri, un tarpit di Turing; accidentalmente è anche il primo.

La maggior parte dei linguaggi di programmazione funzionale non richiede affatto che tu "impari" il calcolo lambda, qualunque cosa significhi, il calcolo lambda è follemente minimo, puoi "imparare" i suoi assiomi in meno di un'ora. Per conoscerne i risultati, come il teorema del punto fisso, il teorema di Church-Rosser eccetera è irrilevante per la programmazione funzionale.

Inoltre, le lambda-astrazioni sono spesso ritenute "funzioni", non sono d'accordo con ciò, sono algoritmi, non funzioni, una differenza minore, la maggior parte dei "linguaggi funzionali" trattano le loro funzioni più come la matematica classica.

Tuttavia, per usare efficacemente Haskell, ad esempio, è necessario comprendere alcuni sistemi di tipo , indipendentemente dal calcolo lambda, il sistema di tipo F del sistema può essere applicato a tutte le 'funzioni' e non richiede lambda astrazioni a tutti. Comunemente in matematica diciamo f: R ^ 2 - > R: f (x) = x ^ 2. Avremmo potuto dire: f (x) = x ^ 2 :: R - > R - > R. In effetti, Haskell si avvicina molto a questa notazione.

Il calcolo lambda è un formalismo teorico, le funzioni di Haskell non sono in realtà più "astrazioni lambda" di f: f (x) = x ^ 2, ciò che rende interessanti le astrazioni lambda è che ci consente di definire ciò che normalmente viene visto come 'costanti' come 'funzioni', nessun linguaggio funzionale lo fa a causa dell'enorme sovraccarico computazionale. Haskell e simili sono solo una forma ristretta del sistema di tipo di System F applicato alle funzioni come usato nella matematica classica di tutti i giorni. Le funzioni di Haskell non sono certamente gli anonimi richiedenti riduzioni formalmente simboliche come lo sono nel calcolo lambda. La maggior parte dei linguaggi di programmazione funzionale non sono sistemi di riscrittura basati su riduzioni simboliche. I lividi sono in una certa misura, ma questo è un paradigma a sé stante e la sua "parola chiave lambda" in realtà non soddisfa il chiamarlo calcolo lambda.

Penso che l'uso del calcolo lambda rispetto alla programmazione in pratica sia che si tratta di un sistema abbastanza minimale che cattura l'essenza dell'astrazione (o "funzioni anonime" o chiusure, se vuoi). A parte questo, non penso che sia generalmente essenziale tranne quando è necessario implementare l'astrazione da soli (come Tetha ( 114646 ) menzionato).

Sono anche completamente in disaccordo con Denis Bueno ( 114701 ) che afferma che è essenziale per la programmazione funzionale. È perfettamente possibile definire, utilizzare o comprendere un linguaggio funzionale senza alcun calcolo lambda. Per comprendere la valutazione dei termini nei linguaggi funzionali (che, a mio avviso, contraddice in qualche modo l'uso di un linguaggio funzionale) molto probabilmente sarà meglio apprendere i sistemi di riscrittura dei termini.

Sono d'accordo con coloro che affermano che è teoricamente possibile apprendere la programmazione funzionale senza apprendere il calcolo lambda — ma qual è il vantaggio di non imparare il calcolo lambda? Non è come se ci volesse un grande investimento di tempo.

Molto probabilmente, ti aiuterà a capire meglio la programmazione funzionale. Ma anche se non lo fa, è comunque una cosa interessante che vale la pena imparare. Il Combinatore di Y è una cosa di bellezza.

Se vuoi solo essere un tecnico e scrivere programmi per fare le cose, allora non hai davvero bisogno di conoscere lambda-calcolo, macchine a stati finiti, automi pushdown, espressioni regolari, grammatica senza contesto, matematica discreta, ecc.

Ma se hai curiosità sui misteri più profondi alla base di queste cose, puoi iniziare a chiederti come si possa rispondere a queste domande. I concetti sono belli e amplieranno la tua immaginazione. Penso anche che, per inciso, ne rendano uno un praticante migliore.

Ciò che mi ha attirato è stato il libro di Minsky Computazione: macchine finite e infinite.

Il calcolo lambda è un modello computazionale, proprio come la macchina turing. Pertanto, è utile se hai bisogno di implementare un determinato valutatore per un linguaggio basato su questo modello, tuttavia, in pratica, hai solo bisogno dell'idea di base (uh. Posto argomento semanticamente corretto nel corpo di una funzione?) E questo è circa esso.

Un modo possibile per imparare il calcolo lambda è

http://en.wikipedia.org/wiki/Lambda_Calculus

Oppure, se vuoi di più, ecco il mio blog dedicato al calcolo lambda e cose del genere

http://weblogs.manas.com.ar/lziliani/

Come ogni astrazione dei calcoli, con il calcolo lambda è possibile modellare elementi utilizzati nella maggior parte dei linguaggi di programmazione, come il sottotipo. Per di più, uno dei migliori libri con usi pratici del calcolo lambda in questo senso è

http://www.amazon.com/Types-Programming-Languages-Benjamin -Pierce / dp / 0262162091 / ref = sr_1_1 ie = UTF8 & amp;? s = libri & amp; qid = 1.222.088,714 mila & amp; sr = 8-1

Ho scoperto che il calcolo Lambda era utile per capire come la programmazione funzionale funzionava a un livello più profondo. Soprattutto come implementare linguaggi funzionali.

Mi ha reso più semplice la comprensione di concetti avanzati come sistemi di tipo e strategie di valutazione (ad es. chiamata per nome anziché chiamata per valore).

Non credo che si debba sapere qualcosa sul calcolo Lambda per utilizzare le tecniche di programmazione funzionale di base. Tuttavia la comprensione del calcolo lambda semplifica l'apprendimento della teoria della programmazione avanzata .

Vorrei anche menzionare che se stai facendo qualcosa nell'area della PNL, il calcolo lambda è alla base di un enorme corpus di lavori in semantica compositiva.

I vantaggi per me sono una programmazione sinergica più compatta. Il materiale tende a fluire in orizzontale più che in verticale. Inoltre è molto utile per la prototipazione di semplici algoritmi. Non so se lo sto usando al massimo delle sue potenzialità, ma lo trovo molto utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top