Quali sono i vantaggi dell'utilizzo di LISP e Haskell? Mi renderanno un programmatore migliore? [chiuso]


41

So che Lisp e Haskell sono rispettivamente linguaggi di programmazione logica e funzionale, ma cosa significa esattamente? In che cosa differiscono dalle altre lingue? Ho sentito che imparare questi ti renderà un programmatore migliore e migliorerà la tua logica. È vero, e se vado ad imparare Lisp o Haskell a un livello competente, la mia programmazione migliorerà e sarò più brava a gestire qualsiasi problema in qualsiasi lingua? Volevo solo sapere se valgono lo sforzo di apprendere. Inoltre, questi linguaggi sono utili in aree come la GUI e la grafica o sono utili solo per le applicazioni console?


36
L'uso di LISP e Haskell ti renderà un programmatore LISP e Haskell migliore, te lo garantisco.
Neil,

17
@MasonWheeler devo dire; c'è molto nel sistema di tipi di Haskell che non troverai in nessun'altra lingua, e le macro LISP non si trovano in nessun linguaggio tradizionale. Entrambe queste cose sono di apprendimento vale la pena, perché non si fanno un programmatore migliore nella tua lingua di lavoro. Almeno questa è stata la mia esperienza; Haskell mi ha reso uno sviluppatore C # aziendale migliore. Conosco tecniche per implementare la separazione delle preoccupazioni in modo chiaro che non avrei mai avuto altrimenti, e analizzare i problemi sarà per me molto più semplice di prima che avessi imparato Haskell.
Jimmy Hoffa,

6
Erlang è un linguaggio funzionale. Rabbit MQ è scritto in Erlang e Rabbit è usato in molti posti per fare un sacco di operazioni di sollevamento pesi mission-critical. I linguaggi funzionali ti insegnano a pensare diversamente alla programmazione, e questo è un bel strumento extra da avere a tua disposizione. Sebbene sia vero che alcuni di questi concetti lo hanno trasformato in linguaggi più popolari (ad esempio espressioni lambda in C # e C ++), tuttavia si utilizza ancora un linguaggio funzionale per risolvere i problemi in modo molto diverso.
Binary Worrier

8
@MasonWheeler Ci sono delle ottime ragioni per cui una lingua può essere più utile delle altre, ma non ancora ampiamente utilizzata. Posso pensare a molti: una base di utenti esistente, un cambiamento troppo radicale, quando "il buono è abbastanza buono", e anche ... quando lo strumento migliore richiede programmatori che sono più formalmente formati. Quindi la popolarità non è una buona misura di utilità .
Andres F.

5
@MasonWheeler Per usare un'analogia, la matematica è un campo estremamente utile nella vita reale. Quindi perché non ci sono più persone competenti in matematica? Perché molte persone ne hanno paura e pensano che sia magia nera e non sia poi così utile?
Andres F.

Risposte:


37

È molto simile all'apprendimento della matematica che migliorerà le tue capacità analitiche e l'apprendimento della letteratura latina / classica migliorerà le tue abilità di scrittura.

Le persone che hanno progettato quelle lingue hanno riflettuto molto su cosa significhi scrivere un programma. E quelle lingue sono il risultato di quelle ricerche.

Detto questo, l'apprendimento di Java ti renderà anche un programmatore migliore. E l'apprendimento C. I veri benefici derivano dall'apprendimento delle lingue con una diversa filosofia. Quindi puoi avere la tua opinione sul modo in cui un programma dovrebbe essere scritto.

modificare

Mi rendo conto che questa risposta non è così utile per le persone che non hanno ancora imparato haskell e / o lisp. Ecco alcuni esempi per spiegare ulteriormente cosa intendo

LISP

Lisp ritiene che la sintassi dovrebbe essere minima e che tutto dovrebbe essere un elenco o una primitiva (Lisp sta per Elaborazione elenco). Anche i programmi sono principalmente elenchi contenenti altri elenchi e simboli. Lisp ti permette di manipolare i programmi come elenco e di generare nuovi programmi al volo. Da qui l'intero code is data and data is codemotto.

La conseguenza diretta è che le lingue Lisp ti consentono di definire qualsiasi interfaccia tu voglia. Un buon esempio è il compojure che è un framework web di clojure. Ecco come appare una funzione di routing

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Un altro bell'esempio è il framework di modelli singhiozzo:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Come puoi vedere, il risultato è conciso come in DSL come i baffi, ma ti consente di utilizzare le funzionalità del linguaggio come (for [x (range 1 4)] block). Ancora più bello, hai tutti gli strumenti per astrarre e strutturare il tuo codice.

In altre lingue, la sintassi è più complessa. Non è possibile leggere un programma Java come un insieme di elenchi. Usando Lisp, però, hai un'idea migliore di come dovrebbe essere un'interfaccia ideale e di come i tuoi dati possono essere astratti nel tuo codice. Ti aiuta anche a vedere la tua lingua preferita come una grande struttura di dati e a comprenderne meglio la semantica.

Haskell

Haskell crede nella tipizzazione statica forte e nella purezza. Le funzioni pure sono come le funzioni matematiche: sono definite su un insieme di valori e le mappano su un altro insieme. La funzione non ha effetti collaterali e i valori sono immutabili. La purezza è interessante perché non è qualcosa che un linguaggio multi-paradigma può avere. Una lingua è pura o no.

Una conseguenza è che non puoi eseguire azioni IO ogni volta che lo desideri (gli haskeller credono che questa sia una buona cosa). Le azioni IO sono definite come transazioni, che sono esse stesse valori puri. Il mainvalore di un programma haskell è una transazione IO eseguita quando si esegue il programma.

Devi gestire esplicitamente il flusso di dati nel tuo programma. Non puoi far comunicare due componenti scrivendo e leggendo cose in una variabile globale. Devi costruire e passare valori.

Un'altra caratteristica menzionata da Jimmy Hoffa è il sistema di tipo ricco. Mentre altre lingue hanno una digitazione statica, in haskell puoi avere cose come:

length :: [a] -> Int (funzione da un elenco di a a un int)

map :: (a -> b) -> [a] -> [b](funzione che accetta una a to btrasformazione e un elenco di a e restituisce un elenco di b)

La cosa bella è che non ho bisogno di spiegare cosa fanno effettivamente quelle funzioni: capisci già il loro comportamento. Inoltre, le funzioni con quelle firme non possono fare altro che calcolare la lunghezza di un elenco e mappare una trasformazione su un elenco.

In altri linguaggi tipizzati, le gerarchie di classi combinate con la mutabilità rendono la gestione di questi tipi un incubo. Devi capire cose come la covarianza e la contraddizione, che sono impossibili da ottenere dal punto di vista linguistico (cioè semplici, potenti e sicure).

O prendi il percorso sicuro (come Scala) e finisci con un linguaggio davvero complesso, oppure prendi il percorso semplice e ottieni qualcosa che è limitato (google go generics limitato a elenco e mappe) o non sicuro (dart generics che sono sempre covariante).

Usando haskell, apprendi principalmente i vantaggi della purezza e come scrivere codice puro.


1
@JimmyHoffa Penso che in realtà meriti una sua risposta, perché questo è ciò che la gente tende a trascurare. Esistono domini problematici meglio risolti dalla programmazione funzionale che le persone non si rendono nemmeno conto di esistere finché non si sono almeno dilettati in quei domini al di fuori della loro zona di comfort.
KChaloux,

2
Non conosco l'Assemblea e non ne ho nemmeno parlato. Tuttavia, assembly può aiutarti a capire come sono in esecuzione i tuoi programmi. Ci sono ottimi post su SO di persone che sono in grado di analizzare un pezzo di assemblaggio generato al fine di spiegare un problema di prestazioni.
Simon Bergot,

3
@KChaloux Scriverei la risposta ma questa domanda dovrebbe essere chiusa (ho votato di conseguenza). In poche parole, potrei scrivere la mia opinione e la mia esperienza in una risposta, ma non sarebbe più giusto o sbagliato rispetto alle altre risposte, che è il problema delle domande relative alle raccomandazioni linguistiche e perché ho votato per chiudere.
Jimmy Hoffa,

7
OMG, @Neil sapendo cosa sta realmente facendo il computer sicuramente ti renderà un programmatore migliore. Non scrivo assembly da anni, ma lo leggo regolarmente (su un sacco di piattaforme) e se ti interessa come funziona il tuo programma, è fondamentale conoscere almeno le basi.
dash-tom-bang,

3
@Neil, in che caso è un vantaggio un programmatore peggiore? Cosa ti fa venire in mente il codice spaghetti? Che cosa ha a che fare il codice spaghetti con l'assemblaggio o l'essere un buon programmatore, tranne che nel fantasyland di non conoscere l'assemblaggio e aver bisogno di una razionalizzazione per evitare di impararlo? Semmai, essere un buon programmatore di assembly rende altamente consapevoli delle cattive pratiche di codifica.
dash-tom-bang,

12

tl; dr Imparare nuove cose non può che renderti un programmatore migliore, ma essere un programmatore migliore non riguarda le lingue in cui puoi scrivere il codice.

Quali sono i vantaggi dell'utilizzo di LISP e Haskell?

LISP:

  1. Codice omoiconico. Ciò consente un codice strutturato di auto-modifica.
  2. Macro consapevoli della sintassi. Consentono la riscrittura del codice del boilerplate.
  3. Pragmatismo. CL è progettato per svolgere attività lavorative da professionisti. La maggior parte dei linguaggi funzionali non lo sono, di regola.
  4. Flessibilità. Può fare molte cose diverse, tutte a velocità ragionevoli.
  5. Wartiness. Il mondo reale è disordinato. La codifica pragmatica finisce per dover usare o inventare costrutti disordinati. Il Lisp comune ha sufficiente verrucosità da poter fare cose.

Probabilmente le uniche ragioni reali per scegliere contro CL è che le librerie standard sono datate.

Esco da un arto e dirò che, nel caso generale, la sintassi non dovrebbe essere un problema per un professionista del software.

Da: Perché è utile Lisp?

Haskell:

Haskell è un linguaggio di programmazione per computer. In particolare, è un linguaggio tipicamente staticamente polimorficamente, pigro, puramente funzionale, abbastanza diverso dalla maggior parte degli altri linguaggi di programmazione. Il linguaggio prende il nome da Haskell Brooks Curry, il cui lavoro nella logica matematica funge da base per i linguaggi funzionali. Haskell si basa sul calcolo lambda, quindi la lambda che usiamo come logo.

Puoi leggere lì una descrizione di Funzionale vs imperativo

Da: http://www.haskell.org/haskellwiki/Introduzione

Mi renderanno un programmatore migliore?

Sì, certo, conoscere più lingue e paradigmi può solo renderti un programmatore migliore, ma chiarisci le cose:

Non esiste un singolo strumento, un singolo libro, un unico paradigma di programmazione che ti renderà un programmatore migliore.

L'apprendimento di linguaggi di programmazione diversi con paradigmi diversi ti aiuta sicuramente a essere un programmatore migliore, imparare a risolvere problemi con approcci diversi anche a beneficio del tuo pensiero logico.

Essere un buon programmatore non riguarda molto la lingua, ma la capacità di risolvere qualsiasi problema in qualsiasi lingua. E quando non conosci la lingua, la possibilità di apprenderla rapidamente e di usarla in modo efficace.

Penso che più il tuo pensiero è globale, migliore è lo sviluppatore.

Ad esempio, puoi aggiungere commenti utili al tuo codice, preoccuparti della leggibilità del tuo codice, della manutenibilità. Presta attenzione ai piccoli dettagli. Pensa prima di digitare !. Scopri i modelli di design. Segui le buone pratiche.

Divulgazione: questa è la pubblicità spudorata del peggior tipo, perché proviene dal mio blog.


4
Hai imparato LISP o Haskell a un livello competente?
Jimmy Hoffa,

10
È un po 'disonesto sentire questo da qualcuno che non sa quasi nulla di nessuna delle due lingue. Sostieni che non sono gli strumenti di cui hai bisogno in questo momento ma non hai idea di cosa siano gli strumenti, quindi come puoi saperlo? Inoltre, come puoi consigliare a qualcuno cosa vorranno o non impareranno da loro, per quanto ne sai LISP è un derivato SQL utile solo nell'analisi dei dati relazionali e Haskell potrebbe essere un sottoinsieme rigoroso di Regexp.
Jimmy Hoffa,

10
Questo non risponde davvero alla domanda. Sei riuscito all'impressionante impresa di dare una risposta vagamente generale a una domanda su due lingue che non conosci: /
Andres F.

2
-1 perché questo danza vagamente attorno a ciò che esattamente Common Lisp e Haskell ti insegnano. Esempi: Codice come Dati dati come codice, purezza, trasparenza referenziale, astrazioni monadiche, programmazione funzionale, programmazione orientata al linguaggio, programmazione orientata al tipo, ecc ecc ecc.
Daniel Gratzer

3
Inoltre, non conoscendo nessuna delle due lingue, non credo che tu possa rispondere a questa domanda: / Mi dispiace
Daniel Gratzer,

9

Quando impari lingue al di fuori del paradigma che di solito operi, ti apriranno la mente a soluzioni alternative nella tua giornata e potrebbero anche aiutarti a capire meglio alcune caratteristiche della tua lingua preferita. Solo sapere che quelle lingue non ti renderanno un programmatore migliore a meno che tu non possa prendere le lezioni che hai imparato da quelle lingue e applicarlo alle situazioni che vedi tutti i giorni.

Detto questo, non è limitato alle lingue. Quando leggi su varie strutture di dati che non hai mai visto o utilizzato in precedenza, può aiutarti ad ampliare l'ambito delle tue conoscenze in modo che la prossima volta che riscontri un problema hai una soluzione possibile in più.

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.