it-swarm.it

Haskell AND LISP vs. Haskell OR Lisp

Attualmente codice con C, C++ e Python. Voglio imparare un linguaggio di programmazione funzionale e in questo momento mi sto sporgendo verso Haskell. NON voglio iniziare qui una guerra "Haskell vs LISP"; quello che voglio sapere è questo: se imparo Haskell principalmente per l'esposizione alla programmazione funzionale, quali benefici otterrò dall'apprendimento successivo di Lisp?

41
Zeke

Suggerisco di imparare entrambi, prima Haskell, poi LISP comune. La mia esperienza con Haskell è stata che la digitazione statica sembrava inizialmente un fastidio limitante, ma una volta che mi sono abituato, ho notato che la maggior parte dei miei errori di tipo avevano errori logici che si nascondevano dietro di loro. Quando arriverai a questo punto e alla prossima pietra miliare, che sta imparando a pensare in 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 citato da Frank Shearar e funzioni generiche con invio multiplo e un sistema avanzato di gestione delle eccezioni.

Quindi perché non imparare prima il LISP comune? Proveniente da un background procedurale e OOP, la mia esperienza è stata che non ho davvero capito la programmazione funzionale fino a quando non ho dovuto usarla esclusivamente. Una volta che la programmazione funzionale è comoda, puoi aggiungere il resto di gli strumenti che Common LISP mette a disposizione e utilizzano qualunque strumento sia il migliore per il compito da svolgere.

58
Larry Coleman

E per favore.

Haskell ti insegna il più puro di FP, per quanto ne so almeno, proprio come Smalltalk insegna il più puro di OO. (Cito questo per non suggerire che OO e FP non può sposarsi, ma perché entrambe queste lingue sono lingue "gemme" - un'idea di base presa per estremi.)

LISP è davvero una famiglia di lingue, quindi parlerò di LISP comune perché è quel particolare membro della famiglia che uso.

LISP avrà ancora molto da insegnarti:

  • È multiparadigma, quindi come sottolinea dsimcha ti 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 marchio molto interessante di OO, con eredità multipla che funziona e funzioni generiche.
31
Frank Shearar

Haskell e LISP sono due bestie totalmente diverse.

Haskell è una sorta di "pura programmazione funzionale in una torre d'avorio"

LISP è una specie di "code-is-data/data-is-code/crea i tuoi costrutti linguistici". Puoi manipolare il tuo codice in qualunque modo tu possa immaginare.

Sono molto diversi. Entrambi condividono l'aspetto della "programmazione funzionale", ma è davvero un piccolo punto in comune rispetto alle loro differenze. Provali e vedrai quanto sono diversi!

11
dagnelies

L'apprendimento di LISP in seguito ti permetterà di personalizzare Emacs che è probabilmente l'editor di testo più avanzato disponibile. Non puoi farlo in Haskell.

11
user1249

Il principale vantaggio che vedo dall'apprendimento di LISP è imparare come integrare FP in un linguaggio multiparadigm orientato al mondo reale, piuttosto che impararlo solo nel contesto di un linguaggio accademico che enfatizza la purezza.

7
dsimcha

Vengo anche da uno sfondo C/C++/Python e ho provato FP un paio di volte negli ultimi anni. Inizialmente ho guardato Haskell e non sono riuscito a capirlo , poi ho provato Ocaml ma non sono andato molto oltre. Alla fine ho iniziato a sentire cose positive su Scala, l'ho provato e l'ho trovato molto adatto a me (avevo anche fatto un po 'di Java = in passato), al punto che dopo un anno di dilettantismo in Scala (e invio di 161 problemi di Project Euler con esso), Haskell sembra avere molto più senso. ho appena ordinato un paio di libri su Haskell e voglio provarlo, anche se questo è in gran parte motivato dall'esistenza di Scalaz.

Quindi ho scoperto che usare un linguaggio multi-paradigma (cioè Scala, ma probabilmente anche LISP si adatterebbe bene) in FP. Ma se sei felice di immergerti in Haskell (non lo ero), provaci.

5
timday

Originariamente provenivo da uno sfondo C/C++/Ruby e ho usato FP concetti in Ruby ogni volta che potevo. Lo stato mi ha fatto male al cervello. Uno dei miei amici mi ha chiamato un giorno e mi ha chiesto di scrivere qualcosa in Haskell (il mio primo lavoro - e si spera non ultimo - Haskell!). Ho imparato rapidamente la lingua e ho messo insieme qualcosa che ha funzionato. Non era bello o altro, ma ha funzionato.

Ho preso una pausa di un mese da Haskell perché non avevo nulla 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 rompere un problema in parti e implementare queste parti in modo diverso in base all'input. Haskell gestisce anche il fallimento estremamente bene attraverso la boxe intelligente dei valori. Ci sono così tanti strumenti per lavorare con queste scatole che dimentichi semplicemente che esistono.

La mia esperienza con LISP (Schema) è stata completamente negativa. Non solo il linguaggio mancava di questi strumenti intelligenti e semplici, ma sembrava pericolosamente lento come Ruby o JavaScript. È stata un'esperienza orribile e non offre nulla di nuovo oltre a Ruby o Python.

Il 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 si mette mai in mezzo.

TL; TR Haskell è una boccata d'aria fresca e LISP è un rubino leggermente più funzionale.

2
Nate Symer