2010-07-23 14 views
10

Eventuali duplicati:
Why functional languages?benefici ed usi di un linguaggio di programmazione funzionale

ho iniziato la programmazione con C/C++, VB, e alla fine Python - tutti i linguaggi imperativi. Ho seguito un corso sui linguaggi di programmazione e ho imparato il mio primo linguaggio funzionale: OCaml. È stato terribile.

Sintassi e altri orrori a parte, OCaml ha preso il mio processo di pensiero imperativo e l'ho buttato fuori dalla finestra. E 'stato frustrante. Ho insistito sul fatto che tutto ciò che poteva essere fatto funzionalmente poteva anche essere fatto in modo imperativo. Ho pensato alla programmazione funzionale come programmazione imperativa senza un arto (effetti collaterali). In risposta alla mia frustrazione, l'unico vantaggio che il mio professore è riuscito a ottenere è stata la capacità di un FPL di parallelizzare le funzioni prive di effetti collaterali.

In ogni caso, basta parlare.

  1. Quali sono alcuni vantaggi che gli FPL offrono sopra IPL?
  2. C'è qualcosa che può essere fatto facilmente in un FPL che non può essere fatto facilmente in un IPL?
  3. Esistono esempi reali di FPL in uso o servono principalmente come esercizi accademici? (Quando dico "mondo reale", intendo un progetto che si basa pesantemente sull'aspetto funzionale della lingua e non stipula un FPL in uno scenario a cui non appartiene).

Grazie,
Advait

+2

Per lo più duplicate: http://stackoverflow.com/questions/36504/ why-functional-languages ​​ –

+1

Solo un breve suggerimento: un linguaggio OO 'impedisce' di accedere a tutte le variabili, nascondendole dietro le astrazioni. Questo ti aiuta a controllare la complessità. Allo stesso modo, un FP impedisce di manipolare lo stato condiviso, e quindi aiuta a scrivere codice parallelizzabile, tra le altre cose. –

+0

Ho visto quel post e ho notato come tutti parlassero di un facile parallelismo. Non ero davvero soddisfatto di nessuna delle risposte. Ritengo che parallelizzare le chiamate alle funzioni standard non fornirà molti vantaggi in termini di prestazioni rispetto al permettere al programmatore di parallelizzare esplicitamente il proprio codice (specialmente perché il sovraccarico di iniziare un nuovo thread per eseguire una funzione potenzialmente banale è piuttosto grande). Quando la scelta è lasciata al programmatore (quando/cosa parallelizzare), lui/lei ottiene la massima libertà - i vantaggi prestazionali del parallelismo senza le stampelle di un FPL. – advait

risposta

14

Prima di tutto, quasi tutte le lingue di uso comune oggi è equivalente in potenza espressiva, sia indispensabile o funzionale, quindi è naturale pensare che qualsiasi cosa si può fare in un linguaggio funzionale che puoi probabilmente fare in modo imperativo, perché probabilmente è vero.

Una delle cose più interessanti dei linguaggi funzionali è che la loro struttura consente l'applicazione dell'inferenza di tipo Hindley-Milner. Questo è il sistema di tipi usato in SML, OCaml e in una serie di altri linguaggi funzionali. Sembra davvero che porti a una riduzione degli errori ed è in grado di farti risparmiare un sacco di tempo ed energia trovando gli errori in anticipo come errori di compilazione.

L'argomento della parallelizzazione automatica è un po 'troppo usato, soprattutto perché la promessa non è avvenuta. Ho scritto codice esplicitamente parallelo in linguaggi funzionali ed è più bello, IMHO, che fare qualcosa di simile in Java o simili.

Aneddoticamente almeno, non sarei la prima persona a sostenere che l'apprendimento di un linguaggio funzionale ti rende un programmatore imperativo migliore! Quel disagio che sentivi nell'avere interrotto il tuo processo di pensiero "imperativo" quando usi OCaml è davvero un buon processo da seguire. Ti fa interrogare le ipotesi e ti impedisce di scrivere codice in un modo particolare solo perché hai sempre fatto così.

Per quanto riguarda l'utilizzo nel mondo reale, si potrebbe voler esaminare gli atti dei workshop Commercial Users of Functional Programming. Esistono anche progetti molto grandi scritti in vari linguaggi funzionali, sebbene la maggior parte di essi abbia probabilmente un interesse limitato al di fuori di comunità piuttosto piccole. I teorici dimostratori Coq e Isabelle sono scritti rispettivamente in Ocaml e SML.

Qualunque cosa tu faccia, vorrei perseverare.Ho passato molto tempo a sbattere la testa contro ML prima che le cose finalmente scattassero. In questi giorni non sono sicuro di ricordare nemmeno come funziona Java o C, perché non ne ho avuto bisogno da molto tempo ... Uso solo ML!

+0

In particolare, questo video sugli usi di Functional Programming su Facebook è davvero interessante e piuttosto avvincente: http://cufp.org/videos/functional-programming-facebook – Gian

+0

Il "potere espressivo" non ti compra molto. Puoi remare su una barca in tutto il mondo o usare una nave. Entrambi hanno il 'potere espressivo' per portarti in giro per il mondo. La maggior parte delle persone non prende la barca a remi. –

+0

@Rainer, non sono sicuro che tu fossi d'accordo con me o meno, ma questo era sostanzialmente il punto che stavo facendo. È banalmente vero che puoi implementare la maggior parte delle cose in qualsiasi linguaggio ragionevole, è solo che tu voglia o meno che sia importante. – Gian

7
  1. Quando finalmente si riesce a mettere a tacere la sua mente imperturbabile (mis), FP diventa effettivamente più facile e più divertente di IP.

  2. FP tende ad essere più sicuro, meno incline agli errori, a causa della sua natura dichiarativa.

  3. Mi piace pensare che la parallelizzazione del codice imperativo raddoppia la sua complessità (provate con un'app parallela non banale). IMO, FP riduce molto il divario, grazie alla mancanza di sincronizzazione in molti casi.

  4. Citando Gian, imparare FP si effettua una saggio programmatore imperativo ...

+3

Non ci sono molti dati reali sul punto 2. È soprattutto un'aspettativa. Se guardi i computer negli aerei, possono usare Ada, che è una lingua tipicamente imperativa. La quantità comparabile di codice scritto in un linguaggio FP (OCAML, Haskell, ...) che gira effettivamente su un computer di volo è probabilmente prossima allo zero. L'unico posto in cui vengono utilizzate le lingue FP è nella verifica dei programmi imperativi, tuttavia il codice FP non è in esecuzione su un computer di volo. Le loro potrebbero essere eccezioni, ma quasi tutto il codice di sicurezza del mondo reale non è in una di queste lingue che ti aspetti di essere più sicuro o meno incline ai bug. –

+0

Sì, è vero che la maggior parte delle prove per il punto 2 è aneddotica, ma ce ne sono molte prove aneddotiche! E in tutta onestà, non ci sono molte informazioni solide sulle tecniche per migliorare la qualità del software in ogni linguaggio. – Gian

+1

C'è una grande quantità di letteratura sulla scrittura di sistemi sicuri per aerei e sistemi simili. Se il software FP è più sicuro o meno buggato, perché non è ampiamente utilizzato nei software mission critical (oltre che per la verifica)? sono verificati i sistemi di runtime di queste lingue? –

Problemi correlati