Haskell AND Lisp vs. Haskell OR Lisp [chiuso]


40

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?


1
E F # e Clojure.
circa

Risposte:


58

Suggerisco di imparare entrambi, prima Haskell, poi Common Lisp. 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 avanzato sistema di gestione delle eccezioni.

Quindi perché non imparare prima Common Lisp? Provenendo da un background procedurale e OOP, la mia esperienza è stata che non ho davvero capito la programmazione funzionale fino a quando non ho dovuto usarlo esclusivamente. Una volta che la programmazione funzionale è comoda, è possibile aggiungere il resto degli strumenti resi disponibili da Common Lisp e utilizzare qualsiasi strumento sia il migliore per il compito da svolgere.


6
Penso che tu l'abbia inchiodato - ciò che rende Haskell e Smalltalk così utili per l'apprendimento è la loro purezza.
Frank Shearar,

4
Concordo con la purezza rende l'apprendimento di una lingua molto più semplice. Non sono riuscito a capire il linguaggio funzionale stesso con LISP perché tutto è possibile nella lingua e ho troppi requisiti imperativi, OO. Ma a Haskell non esistono concetti che interrompano l'apprendimento.
Eonil,

1
È divertente, ho avuto l'esperienza opposta. Ho raccolto i punti principali della programmazione funzionale attraverso Scheme, la mia prima lingua. Occasionalmente faccio hacking in Haskell e inevitabilmente scopro che devo imparare di nuovo il 90% + delle cose che conoscevo ogni volta che lascio Haskell per un po '. Detto questo, Haskell è un linguaggio incredibilmente ricco, con una quantità enorme di insegnamenti (molto forzati). Tipi Tipi Tipi Tipi! Segui i tipi!
Josh Infiesto,

31

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. (Cito questo non per suggerire che OO e FP non possono sposarsi, ma perché entrambe queste lingue sono lingue "gemma" - un'idea fondamentale portata agli estremi.)

Lisp è davvero una famiglia di lingue, quindi parlerò di Common Lisp 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.

11

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.


14
[Affila le parentesi]
Inaimathi,

6
Forse qualcuno può scrivere un editor di testo per questo. Ho sentito che il sistema operativo Emacs non ne ha uno. (Ragazzino. So che puoi ottenere la modalità Viper. :)
Greyfade,

14
In realtà, esiste un clone di Emacs chiamato Yi, che usa Haskell esattamente come Emacs usa Lisp. In effetti, rispetto a (GNU) Emacs, Yi è ancora più puro, perché anche il suo kernel è scritto in Haskell, mentre i kernel di Emacs generalmente non sono scritti in Lisp. Il kernel di GNU Emacs è scritto in C, JEmacs 'è scritto in Java, per esempio.
Jörg W Mittag,

2
@Jörg, se si tratta di 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.

1
@ Thorbjørn Ravn Andersen: Sì, ma non è poi così male. :)
greyfade,

11

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!


+1: buon punto. Conosco un po 'di Haskell e un po' di Lisp. Anche se non sono un esperto di nessuno dei due, penso che tu abbia ragione nel dire che sono molto diversi. In Haskell non hai l'idea di usare i dati come codice. In Lisp non hai il pattern matching (AFAIK). Probabilmente l'elenco (!) Delle differenze è più lungo.
Giorgio

7

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.


5
Immagino che tu voglia una guerra "Haskell vs Lisp"!
Don Roby,

3
Haskell è un linguaggio accademico che enfatizza la purezza ... e molte persone lo usano nel mondo reale. Anche Smalltalk è in quel campo.
Frank Shearar,

Molte persone usano Haskell nel mondo reale?
Jon Harrop,

1
@Jon Harrop: Beh, io uso Haskell nel mondo reale (e funziona davvero bene per alcune applicazioni), forse sono uno dei pochi (?)
Giorgio

5

Vengo anche da un background C / C ++ / Python e ho provato FP un paio di volte negli ultimi anni. Inizialmente ho guardato Haskell e non riuscivo a capirne la testa o la coda, poi ho provato Ocaml ma non ci sono riuscito molto. 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 a Scala (e spedizione 161 Project Euler problemi con esso), Haskell sembra avere molto più senso. In realtà 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 adattava bene) in FP. Ma se sei felice di immergerti in Haskell (non lo ero), provaci.


Interessante che tu sia andato oltre con Scala di OCaml. Come mai?
Jon Harrop,

@Jon: buona domanda; difficile da dire. Forse non ero pronto per "entrare in" funzionale al momento. Forse mi è capitato di trovare un tutorial di Scala lanciato al giusto livello. Forse il lignaggio di Scala C / C ++ / Java lo ha reso un po 'meno alieno. Dato qualsiasi scommessa razionale in questi giorni sarebbe su F # piuttosto che su Scala, probabilmente rivisiterò il dominio OCaml ad un certo punto, anche se da quando mi diletto in questa roba solo per la gioia pura di entrare in una "mentalità di programmazione" diversa dal mio C ++ dayjob, ho un'inclinazione perversa a riprovare Haskell di nuovo in seguito.
giorno

Approccio
fluido

2

Originariamente provenivo da uno sfondo C / C ++ / Ruby e ogni volta che potevo utilizzavo i concetti FP in Ruby. Lo stato mi ha fatto un po '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 (Scheme) è stata completamente negativa. Non solo alla lingua mancavano questi strumenti intelligenti e semplici, ma si sentiva pericolosamente sciolto 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.

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.