Commenti
- E F # e Clojure.
Risposta
Suggerisco di imparare entrambi, prima Haskell, poi Common Lisp. La mia esperienza con Haskell è stata che allinizio la digitazione statica sembrava essere un fastidio limitante, ma una volta che mi ci sono abituato, ho notato che la maggior parte dei miei errori di tipo avevano errori logici nascosti dietro di loro. Quando arriverai a questo punto e alla prossima pietra miliare, che è imparare a pensare per tipi e definire i tuoi tipi come mezzo per esprimere la tua soluzione, sarai pronto per Common Lisp.
Con Common Lisp, puoi aggiungere monadi, curry e tutto ciò che ti è piaciuto da Haskell, ma ottieni anche eredità multiple come menzionato da Frank Shearar e funzioni generiche con invio multiplo e un sistema avanzato di gestione delle eccezioni.
Allora perché Non solo imparare prima il Common Lisp? Venendo da un background procedurale e OOP, la mia esperienza è stata che non capivo veramente la programmazione funzionale fino a quando non dovevo usarla esclusivamente. Una volta che la programmazione funzionale è comoda, puoi aggiungere il resto degli strumenti che Common Lisp rende disponibili e utilizzare qualsiasi strumento sia il migliore per il compito da svolgere.
Commenti
- Penso che tu abbia capito bene: ciò che rende Haskell e Smalltalk così utili per lapprendimento è la loro purezza.
- I daccordo con la purezza rende lapprendimento di una lingua molto più facile. Non sono riuscito ' a capire il linguaggio funzionale stesso con LISP perché tutto è possibile nella lingua e ho troppe esperienze imperative OO. Ma in Haskell non esistono concetti del genere che interrompano lapprendimento.
- È ' divertente, io ' ve ha avuto lesperienza opposta. Ho acquisito i punti principali della programmazione funzionale attraverso Scheme, il mio primo linguaggio. Di tanto in tanto ho hackerato Haskell e trovo inevitabilmente che devo imparare di nuovo il 90% + delle cose che sapevo ogni volta che lascio Haskell per un po . Detto questo, Haskell è un linguaggio incredibilmente ricco, con una quantità enorme da insegnarti (con molta forza). Tipi Tipi Tipi Tipi! Segui i tipi!
Rispondi
E per favore.
Haskell ti insegna il più puro di FP, almeno per quanto ne so, proprio come Smalltalk insegna il più puro di OO. (Lo menziono non per suggerire che OO e FP non possono sposarsi, ma perché entrambi questi linguaggi sono linguaggi “gemelli” – un lidea principale portata agli estremi.)
Lisp è davvero una famiglia di linguaggi, quindi parlerò di Common Lisp perché è il particolare membro della famiglia che uso.
Lisp avrà ancora molto da insegnarti:
- È multiparadigm, così come dsimcha ti fa notare te lo mostrerà come integrare FP con altri paradigmi.
- Lisp ti insegnerà che “code-is-data, data-is-code”, ad esempio attraverso le sue macro.
- CLOS è un marca molto interessante di OO, con ereditarietà multipla che funziona e funzioni generiche.
Answer
Haskell e Lisp sono due bestie completamente diverse.
Haskell è una specie di “pura programmazione funzionale in una torre davorio”
Lisp è una specie di “codice-sono-dati / dati-è-codice / crea i tuoi costrutti di linguaggio”. Puoi manipolare il tuo codice in qualsiasi modo tu possa immaginare.
Sono molto diversi. Entrambi condividono laspetto della “programmazione funzionale”, ma questo è davvero un piccolo piccolo punto comune rispetto alle loro differenze. Provali e vedrai quanto sono diversi!
Commenti
- +1: Buon punto. Conosco un po di Haskell e un po di Lisp. Anche se non sono un esperto in nessuno dei due, penso che tu abbia ragione sul fatto che sono molto diversi. In Haskell tu non hai lidea di usare i dati come codice. In Lisp non hai (AFAIK) pattern matching. Probabilmente lelenco (!) delle differenze è più lungo.
Risposta
Imparare Lisp in un secondo momento ti permetterà di personalizzare Emacs, che probabilmente è leditor di testo più avanzato disponibile. Non puoi farlo in Haskell.
Commenti
- [Affila le parentesi]
- Forse qualcuno può scrivere un editor di testo per questo. Ho sentito che il sistema operativo Emacs ' non ne ha uno. (Scherzo. So che puoi ottenere la modalità Viper. 🙂
- In realtà, cè un clone di Emacs chiamato Yi, che usa Haskell esattamente nello stesso modo in cui Emacs usa Lisp.Infatti, rispetto a (GNU) Emacs, Yi è ancora più puro, perché anche il suo kernel è scritto in Haskell, mentre i kernel di Emacs generalmente tendono a non essere scritti in Lisp. Il kernel GNU Emacs ' è scritto in C, JEmacs ' è scritto in Java, ad esempio.
- @J ö rg, se è una reimplementazione parziale invece di un clone completo di GNU Emacs o XEmacs, non è la stessa cosa. Simile al confronto tra Word e Wordpad o Blocco note.
- @Thorbj ø rn Ravn Andersen: Sì, ma non proprio così male. 🙂
Risposta
Il vantaggio principale che vedo dallapprendimento del Lisp è imparare a integrare FP in un vero linguaggio multiparadigma orientato al mondo, piuttosto che impararlo solo nel contesto di un linguaggio accademico che enfatizza la purezza.
Commenti
- Immagino tu voglia una " Haskell vs Lisp " war!
- Haskell è una lingua accademica che enfatizza la purezza … e molte persone lo usano nel mondo reale. Smalltalk ' anche in quel campo.
- Molte persone usano Haskell nel mondo reale?
- @Jon Harrop: Beh, io uso Haskell nel mondo reale (e funziona benissimo per certe applicazioni), forse sono uno dei pochi (?)
Risposta
Anchio provengo da un background in C / C ++ / Python e ho provato FP un paio di volte negli ultimi anni. Inizialmente ho guardato Haskell e non riuscivo a farne né capo né coda, poi ho provato Ocaml ma non sono andato molto oltre. Finalmente ho iniziato a sentire cose positive su Scala, lho provato e ho trovato che mi andava molto bene (avevo anche fatto un po di Java in passato), al punto che dopo un anno di tanto dilettarmi in Scala (e spedendo 161 Project Euler ha problemi con esso), Haskell sembra avere molto più senso. In effetti ho appena ordinato un paio di libri su Haskell e voglio fare un altro tentativo, anche se questo è in gran parte motivato dallesistenza di Scalaz.
Quindi ho scoperto di usare un linguaggio multi-paradigma (cioè Scala, ma Lisp probabilmente si adatterebbe anche al conto) un buon modo in FP. Ma se sei felice di immergerti in Haskell (io non lo ero), fallo.
Commenti
- È interessante che tu sia andato oltre con Scala rispetto a OCaml. Come mai?
- @Jon: Bella domanda; difficile da dire. Forse non ero ' pronto a " entrare in " funzionale in quel momento. Forse mi è capitato di trovare un tutorial su Scala al giusto livello. Forse il lignaggio C / C ++ / Java di Scala ' lo ha reso un po meno alieno. Dato che qualsiasi scommessa razionale in questi giorni sarebbe su F # piuttosto che su Scala, ' probabilmente rivisiterò il dominio OCaml ad un certo punto, anche se dal momento che mi diletto in questa roba solo per la pura gioia di entrando in una " mentalità di programmazione " diversa dal mio lavoro diurno in C ++, ho la perversa inclinazione a riprovare Haskell il prossimo.
- Approccio in movimento fluido 🙂
Risposta
Originariamente provenivo da uno sfondo C / C ++ / Ruby e ho usato i concetti FP in Ruby ogni volta che potevo. Lo stato mi ha appena fatto male al cervello. Uno dei miei amici un giorno mi ha chiamato e mi ha chiesto di scrivere qualcosa in Haskell (il mio primo – e si spera non lultimo – lavoro Haskell!). Ho imparato rapidamente la lingua e ho messo insieme qualcosa che funzionasse. Non era bello o altro, ma ha funzionato.
Mi sono presa un mese di pausa da Haskell perché non avevo niente per cui usarlo. Ma quando ho deciso che dovevo scrivere il mio software per blog, ho usato Haskell ( https://symer.io ). Haskell è davvero interessante perché puoi suddividere un problema in parti e implementarle in modo diverso in base allinput. Haskell gestisce anche il fallimento estremamente bene attraverso la boxing intelligente dei valori. Ci sono così tanti strumenti per lavorare con queste scatole che ti dimentichi semplicemente che esistono.
La mia esperienza con lisp (Scheme) è stata completamente negativa. Non solo il linguaggio mancava di questi strumenti intelligenti e semplici, ma sembrava pericoloso come Ruby o JavaScript. È stata unesperienza orribile e non offre nulla di nuovo oltre a Ruby o Python.
C ++ non può reggere il confronto con Haskell, al di fuori della gestione della memoria. Haskell è altrettanto veloce (se non più veloce), significativamente più conciso e molto più sicuro. Ma la sicurezza di Haskell non entra mai in gioco il modo in cui.
TL; TR Haskell è una boccata daria fresca e Lisp è un Ruby leggermente più funzionale.