Quali sono i vantaggi dell'uso di LISP e Haskell? Mi faranno diventare un programmatore migliore? [chiuso]

38

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 dire che impararli diventerà un programmatore migliore e migliorerà la tua logica. E 'vero, e se imparassi Lisp o Haskell ad un livello competente, la mia programmazione migliorerà e sarò migliore nel gestire qualsiasi problema in qualsiasi lingua? Volevo solo sapere se valeva la pena di imparare. Inoltre, questi linguaggi sono utili in aree come la GUI e la grafica o sono utili solo per le applicazioni della console?

    
posta Logan545 09.09.2013 - 18:08
fonte

3 risposte

33

È molto importante imparare la matematica a migliorare le tue capacità analitiche e imparare letteratura latina / classica migliorerà le tue capacità di scrittura.

Le persone che hanno progettato quelle lingue hanno pensato seriamente a cosa significa scrivere un programma. E quelle lingue sono i risultati di quelle ricerche.

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

Modifica

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 crede che la sintassi dovrebbe essere minima e che tutto dovrebbe essere una lista o una primitiva (Lisp sta per List Processing). Anche i programmi sono principalmente elenchi contenenti altri elenchi e simboli. Lisp ti consente di manipolare i programmi come elenco e generare nuovi programmi al volo. Da qui l'intero code is data and data is code motto.

La diretta conseguenza è che le lingue Lisp ti permettono di definire qualsiasi interfaccia tu voglia. Un bell'esempio è Compojure, che è un framework web per 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 esempio interessante è il framework di templating:

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

Come puoi vedere, il risultato è terso come nei baffi della DSL, ma ti consente di utilizzare le funzionalità della lingua 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 gruppo di elenchi. Ma usando Lisp, si ottiene una migliore idea di come dovrebbe essere l'interfaccia ideale, e cosa nel codice può essere estratto come dati. Ti aiuta anche a vedere la tua lingua preferita come una grande struttura dati e a comprenderne meglio la semantica.

Haskell

Haskell crede nella tipizzazione statica e nella purezza. Le funzioni pure sono come funzioni matematiche: sono definite su un insieme di valori e le mappano su un altro set. 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 vuoi (haskellers crede che questa sia una buona cosa). Le azioni IO sono definite come transazioni, che sono a loro volta valori puri. Il valore main di un programma haskell è una transazione IO eseguita quando si esegue il programma.

Devi occuparti esplicitamente del flusso di dati nel tuo programma. Non puoi far comunicare due componenti scrivendo & leggere roba in una variabile globale. Devi costruire e passare valori.

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

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

map :: (a -> b) -> [a] -> [b] (funzione che accetta una trasformazione di a to b e una lista di a, e restituisce una lista di b)

La cosa bella è che non ho bisogno di spiegare cosa realmente fanno quelle funzioni: capisci già il loro comportamento. Inoltre, le funzioni con tali firme non possono in realtà 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 l'incubo un problema con questi tipi. Devi capire cose come covarianza e controvarianza, che sono impossibili da ottenere dal punto di vista linguistico (cioè semplice, potente e sicuro).

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

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

    
risposta data 09.09.2013 - 18:28
fonte
12

tl; dr L'apprendimento di nuove cose non può che renderti un programmatore migliore, ma essere un programmatore migliore non riguarda le lingue in cui è possibile scrivere il codice.

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

LISP:

  1. Homoiconic code. This allows structured self-modifying code.
  2. Syntax-aware macros. They allow rewriting of boilerplate code.
  3. Pragmatism. CL is designed to get stuff done by working professionals. Most functional languages aren't, as a rule.
  4. Flexibility. It can do a lot of different things, all at reasonable speeds.
  5. Wartiness. The real world is messy. Pragmatic coding winds up having to either use or invent messy constructs. Common Lisp has sufficient wartiness that it can get stuff done.

Arguably the only real reasons to choose against CL is that the standard libraries are dated.

I will go out on a limb and say that in the general case, syntax should not be an issue to a professional software worker.

Da: Perché è utile il Lisp?

Haskell:

Haskell is a computer programming language. In particular, it is a polymorphically statically typed, lazy, purely functional language, quite different from most other programming languages. The language is named for Haskell Brooks Curry, whose work in mathematical logic serves as a foundation for functional languages. Haskell is based on the lambda calculus, hence the lambda we use as a logo.

Puoi leggere la descrizione di Funzionale vs imperativo

Da: link

Mi faranno diventare un programmatore migliore?

Sì, certo, conoscere più lingue e paradigmi non può che renderti un programmatore migliore, ma capisci bene:

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

Imparare diversi linguaggi di programmazione con diversi paradigmi ti aiuta sicuramente ad essere un programmatore migliore, anche imparare a risolvere i problemi con diversi approcci aiuta molto il tuo pensiero logico.

Essere un buon programmatore non è tanto sulla lingua, ma sull'avere la capacità di risolvere qualsiasi problema in qualsiasi lingua. E quando non conosci la lingua, la capacità di imparare quella lingua velocemente e usarla in modo efficace.

I think, that the more global your thinking is, the better developer you are.

For example, you may add useful comments to your code, care about the readability of your code, the maintainability. Pay attention to the little details. Think before typing!. Learn about desing patterns. Follow good practices.

Divulgazione: questa è pubblicità spudorata del peggior tipo, perché è da il mio blog

    
risposta data 09.09.2013 - 18:37
fonte
9

Quando impari le lingue che sono al di fuori del paradigma di solito, aprirai la tua mente a soluzioni alternative nella tua giornata e potrebbe persino aiutarti a capire meglio alcune caratteristiche della tua lingua preferita. Solo conoscere quelle lingue non ti renderà un programmatore migliore a meno che tu non possa prendere le lezioni apprese da quelle lingue e applicarle a situazioni che vedi ogni giorno.

Detto questo, non è limitato alle lingue. Quando leggi su varie strutture di dati che non hai mai visto o usato prima, può aiutarti ad ampliare la portata della tua conoscenza, così la prossima volta che incontrerai un problema avrai una soluzione più possibile.

    
risposta data 09.09.2013 - 21:56
fonte

Leggi altre domande sui tag