A cosa serve Haskell nel mondo reale? [chiuso]


475

C'è molto clamore intorno a Haskell, tuttavia, è difficile ottenere informazioni su come viene utilizzato nelle applicazioni del mondo reale. Quali sono i progetti / gli usi più popolari di Haskell e perché eccelle nel risolvere questi problemi?


56
No, non lo farò perché è una risposta chiara. Nessun margine di manovra per opinioni e simili. Voglio solo sapere per cosa è stata creata la lingua.
Sergio Tapia,


12
@ Papuccino1, aspetta, vuoi sapere a cosa serve o per cosa è stato creato ? La prima è la domanda che sta ponendo, e c'è molto spazio per un'opinione lì ...
bdonlan,

3
@ Papuccino1 - Quali vantaggi apportano le parole extra nel tuo titolo alla domanda? Inoltre, penso che tu abbia frainteso l'uso del termine "funzionale" in questo contesto, ma è difficile da dire.
Chris Lutz,

2
Secondo il loro sito web molte aziende lo usano per diversi tipi di scopi ... haskell.org/haskellwiki/Haskell_in_industry
Julian

Risposte:


309

Quali sono alcuni usi comuni di questa lingua?

Sviluppo rapido di applicazioni.

Se vuoi sapere "perché Haskell?", Allora devi considerare i vantaggi dei linguaggi di programmazione funzionale (presi da https://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming ):

  • I programmi funzionali tendono ad essere molto più concisi rispetto alle loro controparti in lingua imperativa. Spesso questo porta ad una maggiore produttività del programmatore

  • FP incoraggia la prototipazione rapida. In quanto tale, penso che sia il miglior paradigma di progettazione software per ExtremeProgrammers ... ma che ne so?

  • FP è modulare nella dimensione della funzionalità, dove ObjectOrientedProgramming è modulare nella dimensione di diversi componenti.

  • La possibilità di avere la tua torta e mangiarla. Immagina di avere un sistema OO complesso che elabora i messaggi - ogni componente potrebbe apportare cambiamenti di stato a seconda del messaggio e quindi inoltrare il messaggio ad alcuni oggetti a cui ha collegamenti. Non sarebbe troppo bello essere in grado di ripristinare facilmente ogni modifica se un oggetto nella gerarchia delle chiamate decidesse che il messaggio è difettoso? Che ne dici di avere una storia di stati diversi?

  • Molte attività di pulizia fatte per te: decostruzione di strutture di dati (PatternMatching), memorizzazione di associazioni variabili (LexicalScope con chiusure), digitazione forte (TypeInference), GarbageCollection, allocazione di archiviazione, se usare boxed (puntatore-valore) o unboxed (valore direttamente ) rappresentazione ...

  • Multithreading sicuro! Le strutture di dati immutabili non sono soggette alle condizioni di competizione dei dati e, di conseguenza, non devono essere protette da blocchi. Se si allocano sempre nuovi oggetti, anziché manipolare in modo distruttivo quelli esistenti, il blocco può essere nascosto nel sistema di allocazione e GarbageCollection.

Oltre a questo, Haskell ha i suoi vantaggi come:

  • Sintassi chiara e intuitiva ispirata alla notazione matematica.
  • Comprensioni elenco per creare un elenco basato su elenchi esistenti.
  • Espressioni lambda: crea funzioni senza dare loro nomi espliciti. Quindi è più facile gestire grandi formule.
  • Haskell è completamente referenzialmente trasparente . Qualsiasi codice che utilizza l'I / O deve essere contrassegnato come tale. In questo modo, ti incoraggia a separare il codice con effetti collaterali (ad es. Mettere il testo sullo schermo) dal codice senza (calcoli).
  • La valutazione pigra è una funzione davvero interessante:
    • Anche se qualcosa causerebbe in genere un errore, funzionerà comunque finché non si utilizza il risultato. Ad esempio, è possibile inserire 1 / 0come primo elemento di un elenco e funzionerà comunque se si utilizza solo il secondo elemento.
    • È più semplice scrivere programmi di ricerca come questo risolutore di sudoku perché non carica tutte le combinazioni contemporaneamente, ma le genera semplicemente mentre procede. Puoi farlo in altre lingue, ma solo Haskell lo fa di default .

Puoi controllare i seguenti link:


20
Il seguente pensiero spesso mi attraversa la mente: in un linguaggio puro, una funzione restituisce sempre lo stesso risultato quando vengono passati gli stessi parametri. Questa è una garanzia Le lingue imperative, al contrario, costruiscono tutto sopra le "dichiarazioni". Una dichiarazione non viene fornita con alcun tipo di garanzia (tranne che per la sua esecuzione richiede tempo e produce calore). Quindi le fondamenta sono già traballanti e ogni cosa sopra di essa rimarrà traballante. Per me questo è stato uno dei motivi per imparare l'hashell.
Martin Drautzburg,

8
Sono passati 6 anni da quando è stata posta questa domanda e dal debutto del linguaggio di programmazione Go. Nonostante abbia un sistema di tipo più debole e sia generalmente "oggettivamente inferiore" (secondo i fan funzionali / ML), è riuscito a distribuire più software (e più importante) in quei 6 anni di quanto Haskell abbia nei suoi 26 anni. Intendo questo come caso di studio; ci sono chiaramente cose che trattengono i linguaggi funzionali e non possono essere tutti attribuiti a hype.
weberc2,

3
Hai dimenticato un punto: la codifica in haskell è un'esplosione assoluta;) Mi sono divertito così tanto a provare la mia mano ad alcuni problemi in haskell.
J Atkin,

8
@MartinDrautzburg Naturalmente le dichiarazioni vengono fornite con garanzie. Che tipo di linguaggio utile avrebbe dichiarazioni senza garanzie? Ad esempio in C x = 5;garantisce che dopo l'esecuzione, xcontiene il valore 5.
user253751

5
@ E4z9 Sì, ma in C ++ garantisce che operator =si chiama. E garantisce cosa succede se non si definisce unoperator =
user253751

234

Penso che alle persone in questo post manchi il punto più importante per chiunque non abbia mai usato un linguaggio di programmazione funzionale: espandere la tua mente. Se non conosci la programmazione funzionale, Haskell ti farà pensare in modi che non avevi mai pensato prima. Di conseguenza, la tua programmazione in altre aree e in altre lingue migliorerà. Quanto? Difficile da quantificare.


2
Sto usando un iPhone, un Mac. Dove si usa Haskell? Voglio dire per le app che ho usato sono scritte in Objective-C o Swift + qualcosa per database e server. Swift può anche essere funzionale. Quindi di nuovo sono confuso su dove viene utilizzato
Honey

2
Facebook esegue il rilevamento SPAM con esso: code.facebook.com/posts/745068642270222/…
Alex

25
Questa risposta, scritta in un tono diverso, dice che Haskell è un ottimo esercizio per un programmatore, che l'IMO non fa un linguaggio per scopi generici
Passer Entro il

5
A Keera Studios scriviamo giochi e app iOS e Android usando Haskell.
Ivan Perez,

1
Sono totalmente d'accordo con questo. Ho scritto molto codice per decenni in linguaggi imperativi. Ho esplorato Haskell per un paio di mesi e mi ha aperto la mente a cose a cui non avevo pensato prima.
Adahus,

87

C'è una buona risposta a cosa serve una lingua per scopi generici come Haskell: scrivere programmi in generale.

Per quello che viene utilizzato in pratica, ho tre approcci per stabilire che:

Indica che è buono per la grafica, il networking, la programmazione dei sistemi, le strutture dati, i database, lo sviluppo, l'elaborazione del testo ...

E infine, la mia opinione su ciò che è veramente forte in:

Spero che ciò ti dia un'idea di quanto sia ampia la tua domanda, se si deve rispondere con qualsiasi specificità.


15
La nuvola di tag è rotta
Elliot Cameron,

la nuvola di tag è stata generata usando wordcloud ?
Janus Troelsen,


18

Dal wiki di Haskell :

Haskell ha una vasta gamma di usi commerciali, dall'aerospaziale e della difesa, alla finanza, alle startup web, alle aziende di progettazione hardware e ai produttori di tosaerba. Questa pagina raccoglie risorse sull'uso industriale di Haskell.

Secondo Wikipedia, il linguaggio Haskell è stato creato dall'esigenza di consolidare i linguaggi funzionali esistenti in un linguaggio comune che potrebbe essere utilizzato per future ricerche nella progettazione del linguaggio funzionale.

È evidente in base alle informazioni disponibili che ha superato il suo scopo originale e viene utilizzato per molto più della ricerca. Ora è considerato un linguaggio di programmazione funzionale per tutti gli usi.

Se ti stai ancora chiedendo "Perché dovrei usarlo?", Allora leggi Perché usarlo? sezione della introduzione al wiki di Haskell.


13

Haskell è un linguaggio di programmazione generico. Può essere utilizzato per qualsiasi cosa tu usi in qualsiasi altra lingua. Non sei limitato da altro che dalla tua stessa immaginazione. Per cosa è adatto? Bene, praticamente tutto. Esistono poche attività in cui un linguaggio funzionale non eccelle.

E sì, sono il Rayne di Dreamincode. :)

Vorrei anche ricordare che, nel caso non abbiate letto la pagina di Wikipedia, la programmazione funzionale è un paradigma come la programmazione orientata agli oggetti è un paradigma. Nel caso non lo sapessi. Haskell è anche funzionale nel senso che funziona; funziona abbastanza bene.

Solo perché una lingua non è una lingua orientata agli oggetti non significa che la lingua sia limitata da nulla. Haskell è un linguaggio di programmazione generico, ed è altrettanto generico di Java.


9

Ne ho uno bello, Facebook ha creato uno strumento automatizzato per riscrivere il codice PHP. Analizzano la sorgente in un albero di sintassi astratto, fanno alcune trasformazioni:

if ($f == false) -> if (false == $f)

Non so perché, ma quello sembra essere il loro stile particolare e poi lo stampano piuttosto.

https://github.com/facebook/lex-pass

Usiamo haskell per creare linguaggi specifici per piccoli domini. Enormi quantità di elaborazione dei dati. Sviluppo web. Ragni web. Test delle applicazioni. Scrittura di script di amministrazione del sistema. Script back-end, che comunicano con altre parti. Script di monitoraggio (abbiamo un DSL che funziona bene insieme a Munin, rende molto più facile scrivere il codice di monitoraggio corretto per le tue applicazioni.)

Tutti i tipi di cose in realtà. È solo un linguaggio di uso generale di tutti i giorni con alcune caratteristiche molto potenti e utili, se sei un po 'matematicamente incline.


6
Ri: lo stile FB, mettendo il falso prima del == significa che se si dimentica e si scrive solo una singola = allora il comportamento risultante sarà più evidentemente sbagliato invece di eseguire silenziosamente un'operazione di assegnazione non intenzionale e continuare normalmente
Magnus

A che è intelligente, la tua forza in quel particolare errore è nota per essere compilata in quel momento.
Edgar Klerks,

@EdgarKlerks, PHP non ha tempo di compilazione. Questo costringe a sollevare l'eccezione dov'era l'errore, piuttosto che portare a comportamenti bizzarri o errori nel codice distante.
Dfeuer,

Anche se vedo il vantaggio di scrivere falsea sinistra, non vedo il punto di usare uno strumento per farlo automaticamente: se hai già un ==operatore allora sai già che non hai il bug di cui quella parte lex-pass è pensato per catturare, e se hai un =invece non c'è modo sicuro di dire se è deliberatamente così.
Elenco Jeremy,

1
@JeremyList Forse sono molto severi sullo stile di programmazione. Vedo che il codice ben formattato invita a scrivere codice più ben formattato. Solo un'ipotesi selvaggia.
Edgar Klerks,

6

Da Haskell :

Haskell è un linguaggio di programmazione standardizzato, puramente funzionale , con semantica non rigorosa e una forte tipizzazione statica. Prende il nome dal logico Haskell Curry.

Fondamentalmente Haskell può essere usato per creare praticamente tutto ciò che normalmente creeresti usando altri linguaggi di uso generale (es. C #, Java, C, C ++, ecc.).


5

Ad esempio, per lo sviluppo di applicazioni Web HTML5 interattive in tempo reale. Vedi Elm , il cui compilatore è implementato in Haskell e la cui sintassi prende in prestito molto da Haskell.


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.