È 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 code
motto.
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 main
valore 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 b
trasformazione 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.