it-swarm.it

Haskell vs Erlang per i servizi web

Sto cercando di iniziare un progetto sperimentale usando un linguaggio funzionale e sto cercando di decidere tra Erlang e Haskell, ed entrambi hanno alcuni punti che mi piacciono molto.

Mi piace il sistema di tipo forte e la purezza di Haskell. Ho la sensazione che renderà più facile scrivere codice veramente affidabile. E penso che il potere di Haskell renderà molto più facile ciò che voglio fare.

Sul lato negativo ho la sensazione che alcuni dei Frameworks per fare cose sul web su Haskell come Yesod non siano così avanzati come le loro controparti Erlang.

Mi piace piuttosto l'approccio Erlang ai thread e alla tolleranza agli errori. Ho la sensazione che la scalabilità di Erlang potrebbe essere un grande vantaggio.

Il che porta alla mia domanda: qual è stata l'esperienza della gente nell'implementazione di backend di applicazioni Web sia in Haskell che in Erlang. Ci sono pacchetti per Haskell per fornire alcuni dei fili e attori leggeri che uno ha in Erlang?

29
Zachary K

L'unica domanda che ho è cosa sta facendo il tuo servizio web? Se il servizio web è veramente un problema funzionale, allora Haskell si adatterà meglio.

Erlang non è necessariamente un linguaggio funzionale. È un linguaggio procedurale con un modello di esecuzione molto forte per sistemi fortemente paralleli. È stato progettato per il settore delle telecomunicazioni e si adatterebbe perfettamente per rispondere alle richieste dei servizi web.

Vedi questa pagina * per una panoramica delle differenze tra programmazione procedurale e funzionale. (Mi scuso in anticipo per il brutto nero sulla pagina ciano).

Se il tuo servizio web sta eseguendo una buona dose di pattern matching e applica regole, allora Haskell è la tua scelta. Se desideri solo un'infrastruttura scalabile che non sia troppo diversa dalle lingue che probabilmente conosci già, scegli Erlang.

(* collegamento tramite la macchina Wayback. Il file originale è stato rimosso)

19
Berin Loritsch

Tra le due citate, sicuramente Haskell è accademico, mentre Erlang è utilizzato in progetti di alta scalabilità nella vita reale. Quindi tra i due servizi web sceglierei Erlang.

Ma direi che hai una terza scelta: Scala , un linguaggio fortemente influenzato sia da Haskell che da Erlang. Viene utilizzato per creare servizi Web di prim'ordine come Twitter o Foursquare. C'è anche Lift , un framework web ispirato a Rails e Django, sebbene con un approccio un po 'diverso, più funzionale. Foursquare sta usando Lift.

10
vartec

Di solito dico: "impara le cose il più lontano possibile dalla tua zona di comfort, ti renderà un programmatore migliore anche se non lo usi mai in pratica".

In questo caso, ciò potrebbe probabilmente significare Haskell; ma Erlang non sta solo diventando quasi socialmente accettabile; ma i punti principali (processi chiari, passaggio di messaggi, enorme scalabilità) stanno arrivando su molte altre piattaforme "pratiche", quindi le lezioni apprese hanno un'applicabilità grande e immediata su un lavoro più "reale".

il mio consiglio: se è per divertimento, fai Haskell. se è per l'allenamento, vai Erlang.

6
Javier

Haskell (GHC) ha un supporto immediato per i thread verdi (i "processi" di Erlang). Ad esempio forkIO genera un nuovo thread verde e restituisce il suo ID thread.

forkIO :: IO () -> IO ThreadId

il meccanismo di passaggio dei messaggi è implementato dal pacchetto distribuito-processo ma non è molto ben mantenuto.
Il meccanismo di condivisione dei dati di Haskell differisce da quello di Erlang. Haskell abbraccia l'idea di stati globali mutabili e ha aggiunto astrazioni per renderlo sicuro da usare. Un primo esempio di ciò è TVar ( [~ # ~] t [~ # ~] ransactioal Var iable) che abilita transazioni atomiche componibili .
Haskell ha anche alcune librerie di servizi Web di altissimo livello che fanno uso del suo sistema di tipi espressivi (tipi dipendenti), ad esempio servo. Ti permette di specificare il tuo REST API usando DSL a livello di tipo che può essere usato in fase di compilazione per garantire la sicurezza del tipo.

Modificare:
apparentemente distribuito-chiusura implementa anche la serializzazione di chiusura con l'aiuto di staticptr

1
Poscat

Potresti anche considerare Rust .

  • Non è puramente funzionale, ma incoraggia uno stile semi-funzionale
    • Chiusure
    • Immutabilità di default
    • Ha un sistema macro forte, sicuro, che consente di scrivere macro (o utilizzare quelli esistenti creati dalla comunità) per scrivere codice in uno stile più funzionale
  • Ha librerie/framework per ogni livello di astrazione
  • Ha una forte enfasi sull'efficienza della memoria efficiente
  • Ha un sistema di tipo forte
  • Rende davvero semplice ogni tipo di concorrenza (purché soddisfi tutti i requisiti di sicurezza)
  • Ha una grande comunità attiva
  • È open-source (come gli altri che hai menzionato)
  • eccetera.
0
Solomon Ucko