Qual è il linguaggio di produzione più compatibile e ampiamente utilizzato per esportare le conoscenze e le abilità acquisite da Haskell?


14

Mi piace Haskell, chiaro e semplice. Mentre Haskell è utilizzato nei software di produzione, non è particolarmente diffuso da quello che ho visto. Qual è la lingua più simile e ancora ampiamente utilizzata per quanto riguarda i progetti di produzione in modo che io abbia la possibilità di avere una palla di neve di usare qualcosa di altrettanto fantastico nell'industria?

Inoltre, la stessa lingua della prima parte è disponibile su un gran numero di piattaforme? In caso contrario, qual è la migliore alternativa che dispiega un'ampia piattaforma? Vorrei una sola lingua da mettere nella mia lista di cose da fare piuttosto che un enorme sciame o famiglia. Le prove concrete sarebbero un vantaggio.

Risposte:


21

Haskell è strettamente legato alla famiglia di lingue ML. Ciò include cose come OCaml , ovviamente, ma anche F # sulla piattaforma .NET. Questi linguaggi condividono con Haskell le basi del sistema di tipi e il modo in cui i dati vengono utilizzati - tipi di dati algebrici, corrispondenza dei modelli, inferenza dei tipi, ecc. Naturalmente possono differire sostanzialmente da Haskell su altri punti - la maggior parte delle ML sono rigide e impure , per cominciare, e la popolarità di Haskell come veicolo per la ricerca nei sistemi di tipi e nella progettazione del linguaggio significa che la maggior parte dei linguaggi in stile ML tendono ad avere sistemi di tipo meno potenti (ma potenzialmente più facili da capire). Probabilmente è sicuro di dirlo mentre potresti perdertialcune cose su Haskell, in particolare all'inizio, la maggior parte dei programmatori Haskell probabilmente si sentirebbero a proprio agio a casa in una ML piuttosto rapidamente, a un livello base di preparazione. Se vuoi una lingua con la stessa struttura generale di Haskell, una ML è la soluzione migliore.

Il lato funzionale di Scalaattinge fortemente anche dalla tradizione ML, e include anche alcune funzionalità di sistema avanzate familiari a Haskell, oltre a un sistema OOP più standard integrato con quanto sopra. Mentre OO in linguaggi in stile ML tende ad essere affrontato come più di un "modello OO con strumenti funzionali di base" Scala vive e respira OO in stile Java. Ciò ha vantaggi per l'interoperabilità Java, come puoi immaginare, e presenta un ambiente di lavoro più familiare per i programmatori OO. Tuttavia, proveniente da uno sfondo di Haskell, è più probabile che tu sia infastidito dai modi in cui mescolare le cose insieme in Scala rende più goffi gli idiomi funzionali e trova che la maggior parte delle API Java siano progettate male e inutilmente difficili da usare.

Infine, sebbene possa sembrare strano da considerare, Clojure ha in realtà molte cose in comune con Haskell a un livello più filosofico. Gran parte di ciò che troverete nell'approccio di Clojure allo stato e ai valori rispetto alle identità è molto vicino nello spirito a ciò che Haskell formalizza attraverso il sistema dei tipi. Di conseguenza, Clojure enfatizza l'interoperabilità Java in misura minore e non si preoccupa tanto del trascinamento in OOP, quindi in qualche modo l'approccio di Clojure alla stessa programmazione funzionale potrebbe essere più vicino a ciò che già conosci. Penso a questo proposito dire che, per quanto ne so, Clojure è l'unica lingua oltre a Haskell che ha un'implementazione di STMè semplice, efficace e funziona. D'altra parte, Clojure proviene dalla tradizione Lisp e quindi manca del sistema di tipi statici e dell'enfasi sui tipi di dati algebrici e sulla corrispondenza dei modelli trovati nei linguaggi influenzati dalla ML. E ovviamente è un Lisp, che è di per sé un aspetto negativo per alcune persone (anche se non so davvero perché).

Parlando da solo, con il disclaimer che la mia prima esperienza con la programmazione funzionale è stata in Scheme, probabilmente mi spingerei verso Clojure, con OCaml probabilmente una seconda scelta.


Si dice che F # sia stato ispirato, se non derivato, da OCaml. Una precedente domanda SO, F # e OCaml , copre una buona discussione di quella relazione. Se sei sul lato .NET, F # sarebbe una scelta eccellente e Microsoft ora considera F # un linguaggio .NET "di prima classe". Sul lato JVM, Scala ha una storia di utilizzo industriale e Clojure sembra essere in aumento nelle classifiche. Non conosco nessuna scelta migliore, in questo momento, poiché il mercato non ha ancora dichiarato un chiaro vincitore in questo spazio oggetto-funzionale.
John Tobler,

4

Non l'ho mai usato da solo, ma vedo Scala spuntare nei blog o nelle descrizioni dei progetti a volte e credo che abbia preso i concetti principali da Haskell. Scala viene compilato in JVM e può interagire con Java.


3

Un'alternativa funzionale è Erlang . Sebbene sia un linguaggio molto concorrente, il sottoinsieme sequenziale è un linguaggio funzionale puro con molte delle proprietà dei linguaggi funzionali, ad esempio chiusure, dati immutabili e corrispondenza dei modelli. Funziona su molte piattaforme tra cui Linux, vari Unix, Windows e Macosx. Ora c'è persino un'implementazione sulla JVM, erjang . Può facilmente comunicare e coesistere con altre lingue, è così che viene spesso utilizzato.

Dai un'occhiata al sito principale .


3

Il clojure è sempre più ampiamente usato e, sebbene non assomigli ad Haskell ad un livello superficiale, se guardi un po 'più in profondità è chiaramente molto ispirato da Haskell e incoraggia uno stile funzionale molto simile.

Funzionalità Key Clojure che gli utenti di Haskell possono trovare familiari e avvincenti:

  • Il linguaggio di base è puramente funzionale - mentre gli effetti collaterali sono possibili, sono sepolti in luoghi specifici (ad esempio riferimenti STM, funzioni IO, interoperabilità Java)
  • Tutte le strutture di dati sono immutabili e persistenti
  • Pigrizia - raggiunta in gran parte attraverso le onnipresenti sequenze pigre di Clojure, questo sembrerà molto familiare agli utenti di Haskell. Le sequenze pigre infinite vanno bene.
  • Software Transactional Memory - è il modo principale di gestire lo stato mutevole in Clojure. Vale la pena guardare questo eccellente video in cui Rich Hickey spiega l'approccio di Clojure all'identità e allo stato: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Differenze chiave (possono essere positive o negative a seconda della prospettiva):

  • È impuro - anche se la mia osservazione è che lo stile Clojure idiomatico è di attaccare funzioni pure ovunque possibile.
  • Digitazione dinamica anziché statica (sebbene i suggerimenti sul tipo statico possano essere utilizzati facoltativamente per l'ottimizzazione delle prestazioni)
  • È un linguaggio JVM con facile accesso all'intero ecosistema di librerie Java - questo è secondo me il più grande vantaggio in termini di applicabilità nel mondo reale
  • Sintassi di Lisp. Quindi ottieni tutti i vantaggi dell'omoiconicità , al costo di dover imparare a vedere attraverso tutte le parentesi :-)

Prospettiva personale: ho imparato Haskell prima di Clojure e ho adorato Haskell per la sua eleganza e purezza matematica. Clojure trae molta ispirazione e prende in prestito molte buone caratteristiche da Haskell, ma è un linguaggio molto più pragmatico / pratico. Soprattutto quando si considera l'enorme valore di essere in grado di sfruttare l'ecosistema della libreria Java, è un ottimo linguaggio per "fare cose".


1

Se ti piace Haskell, ma devi creare un codice per JVM, frege potrebbe essere interessante per te. È progettato per essere il più vicino possibile a Haskell 2010, ma genera codice Java.

Naturalmente, frege stesso non assomiglia a "un linguaggio di produzione ampiamente utilizzato" (è appena stato pubblicato di recente), ma Java lo è sicuramente.

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.