2012-07-13 11 views
6

Mi piacerebbe imparare un linguaggio funzionale per ampliare il mio orizzonte. Ho conoscenza di Python e C/C++ e voglio che una lingua sia facile da imparare da qualcuno che proviene dal dominio imperativo delle lingue. Non mi interessa se la lingua è abbastanza potente. Voglio solo un linguaggio per imparare le basi della programmazione funzionale e poi cercherò un linguaggio più difficile (e potente).Qual è il linguaggio di programmazione funzionale più semplice per chi ha esperienza in lingue imperative?

Grazie

+3

Haskell è spesso consigliato per imparare il paradigma funzionale in quanto è puro. Non è facile, ma forse potresti confonderlo mescolando il paradigma procedurale e funzionale in altri linguaggi (Scala e altri). – MatijaSh

risposta

8

vi consiglio pure-lang per questi fini pedagogici. È anche molto potente. Se vuoi qualcosa di più popolare/con più supporto per la comunità, allora consiglierei Scheme o OCaml, a seconda che preferiresti trattare con sintassi non familiare (vai con Scheme) o gestire la tipizzazione non familiare (vai con OCaml) prima. SML e F # sono leggermente diversi da OCaml. Altri hanno o menzioneranno Clojure, Scala e Haskell.

Clojure è una variante di Scheme, con le sue idiosincrasie (ad esempio, nessuna ottimizzazione di tail-call), quindi utilizzarla sarebbe un modo per iniziare con Scheme. Mi aspetterei che avresti un tempo più semplice con un'implementazione Scheme meno idiosincratica. Racket è ciò che viene spesso utilizzato per l'insegnamento. Scala sembra essere fondamentalmente simile a OCaml, ma si basa solo sulla familiarità casuale.

A differenza di Haskell, le altre lingue menzionate hanno tutti due vantaggi: (1) l'ordine di valutazione è desiderabile per impostazione predefinita, sebbene sia possibile ottenere una valutazione lenta specificatamente richiedendola. In Haskell è il contrario. (2) La mutazione è disponibile, anche se molte delle librerie e del codice che vedrete non la usano. In realtà penso che sia pedagogicamente meglio imparare la programmazione funzionale e allo stesso tempo avere un occhio su come interagisce con gli effetti collaterali, e lavorare sulla strada verso la composizione in stile monadico. Quindi penso che questo sia un vantaggio. Alcuni ti diranno che è meglio essere gettato nella gestione di mutato più in quarantena di Haskell, però.

Robert Harper a CMU has some nice blog posts on teaching functional programming. Come ho capito, preferisce anche le lingue come OCaml per l'insegnamento.

Tra le tre classi di lingue che ho consigliato (Pure, Scheme e friends, OCaml e friends), le prime due hanno una digitazione dinamica. Il primo e il terzo hanno celle di riferimento esplicite (come in Python, ti sei limitato a non riassegnare mai una variabile, ma puoi ancora cambiare ciò che è memorizzato in un indice di lista). Schema ha celle di riferimento implicite: le variabili stesse sembrano mutabili, come in C e Python, e la gestione delle celle di riferimento viene eseguita sotto le copertine. In linguaggi come questi, hai spesso anche una qualche forma di cella di riferimento esplicita (come nell'esempio che ho appena dato in Python, o usando coppie/liste mutabili in Racket ... in altri Schemi, incluso lo Scheme standard, quelli sono i coppie/liste predefinite).

Una virtù che Haskell possiede sono alcuni libri di testo che vengono visualizzati per questo. (Intendo sinceramente, non in modo sgradevole). Quali libri/risorse usare è un'altra questione controversa con molte guerre/domande chiuse. SicP come altri hanno raccomandato ha molti fan e anche alcuni critici. Mi sembrano molte buone scelte. Non mi avventuro ulteriormente in quei dibattiti.

1

Questa domanda è probabilmente fuori tema, perché sta per provocare guerre lingua infinite, ma qui è un po 'generale del consiglio:

Ci sono una classe di linguaggi di programmazione funzionale che a volte sono chiamati "per lo più funzionale" , in quanto consentono alcune caratteristiche imperative dove le vuoi. Gli esempi includono Standard ML, OCaml, F # e Scala. Potresti considerare uno di questi se vuoi essere in grado di afferrare lo stile idiomatico funzionale pur essendo in grado di ottenere le cose in modi ragionevolmente familiari.

Ho usato Standard ML in modo esteso in passato, ma se stai cercando qualcosa che abbia un po 'meno di una curva di apprendimento, personalmente consiglierei Scala, che è il mio secondo linguaggio di programmazione preferito. Le ragioni di ciò includono la prevalenza di biblioteche, una comunità di dimensioni soddisfacenti e la disponibilità di libri e tutorial per aiutarvi ad iniziare (in particolare se avete mai avuto rapporti con Java).

+1

Mi chiedo se la possibilità di ricorrere allo stile imperativo quando si desidera possa diventare un ostacolo all'apprendimento dello stile funzionale. – Thilo

+0

La domanda chiedeva esplicitamente "più facile da imparare", quindi mentre sono d'accordo sul fatto che avere un ripiego imperativo potrebbe non essere la migliore strategia a lungo termine, riduce la curva di apprendimento in modo tale da non dover imparare come funziona l'IO in un ambiente puro allo stesso tempo di tutto il resto :) – Gian

+0

Sì, mi aspetto che questa domanda venga chiusa presto. – dubiousjim

4

Inizialmente, leggere Struttura e implementazione dei programmi per computer. Raccomando Lisp (per esempio, è il dialetto Scheme) come primo linguaggio di programmazione funzionale.

+0

Sono d'accordo con il tuo suggerimento. Ho beneficiato molto da SICP e facendo gli esercizi.Raccomanderò inoltre vivamente di studiare SICP. – weima

+0

Forse il nome del libro è _Struttura e interpretazione dei programmi per computer_ – ibubi

2

Un'altra opzione è Clojure, che mi è stato dato di capire è più "puramente" funzionale di Scheme/Racket (non chiedermi informazioni sui dettagli qui) e possibilmente abbastanza simile da permetterti di usarlo in congiunzione con SICP (Struttura e interpretazione dei programmi per computer, un libro altamente raccomandato suggerito anche da un'altra risposta).

1

Un elemento che non è stato discusso è la disponibilità di una sintassi speciale per la corrispondenza del modello per i tipi di dati algebrici, come in Haskell, tutti i tipi di ML e probabilmente molti altri linguaggi menzionati. La sintassi di corrispondenza del modello tende ad aiutare il programmatore a vedere le sue funzioni come funzioni matematiche. La sintassi di Haskell è sufficientemente complessa, e le sue implementazioni hanno messaggi di errore di analisi sufficientemente scarsi, che la sintassi è un buon motivo per non scegliere Haskell. Scheme è probabilmente più facile da imparare rispetto alla maggior parte delle altre opzioni (e Scheme probabilmente ha il re di tutti i sistemi macro), ma la mancanza di sintassi di pattern matching mi allontanerebbe da esso per una programmazione intro-funzionale.

+1

Sono completamente d'accordo sull'importanza della corrispondenza del modello nella programmazione funzionale dell'apprendimento. Penso che sarà disponibile con più o meno lavoro sulla maggior parte o tutte le scelte però. Molte implementazioni di Schema presentano corrispondenze di pattern almeno come estensione; La racchetta lo ha in modo nativo. Una versione agnostica di implementazione è distribuita con il libro di testo Essentials of Programming Languages. Con ogni mezzo qualcuno che apprende FP con Scheme dovrebbe assicurarsi di sfruttare queste strutture. – dubiousjim

+1

Il mio ricordo è che la sintassi per la corrispondenza dei pattern in Racket è molto meno leggibile e scrivibile della sintassi per farlo in ML. Sono confuso? Il fatto che Racket non abbia i tipi di dati algebrici (sebbene la sub-lingua PLAI faccia un ottimo lavoro nel simularli) peggiora le cose. – dfeuer

+0

@dfeuer Ne ho discusso a lungo con la comunità Lisp quando stavo scegliendo tra Lisp e OCaml. I Lisper rispondono che i Lisps potrebbero non avere tipi di dati algebrici, ma hanno macro che ti permettono di scrivere la tua libreria di pattern matching che è ancora più potente perché puoi fare la piena unificazione. Tuttavia, la corrispondenza dei pattern è onnipresente in OCaml, F #, Haskell e Scala mentre l'unificazione è quasi sconosciuta in Lisp, Scheme, Racket e Clojure. Quindi penso che sia giusto dire che i Lispers abbiano perso quello. La corrispondenza tra pattern è enormemente preziosa e rende le ML molto migliori delle Lisps. –

2

Mi piacerebbe imparare un linguaggio funzionale per ampliare il mio orizzonte. Ho conoscenza di Python e C/C++ e voglio che una lingua sia facile da imparare da qualcuno che proviene dal dominio imperativo delle lingue. Non mi interessa se la lingua è abbastanza potente. Voglio solo un linguaggio per imparare le basi della programmazione funzionale e poi cercherò un linguaggio più difficile (e potente).

Ottima domanda!

Avevo fatto BASIC, Pascal, assembler, C e C++ prima di iniziare a fare programmazione funzionale alla fine degli anni '90. Poi ho iniziato a utilizzare due linguaggi funzionali all'incirca nello stesso periodo, Mathematica e OCaml, e li usavo esclusivamente in pochi anni. In particolare, OCaml mi ha lasciato scrivere un codice imperativo che sembrava il codice che avevo scritto prima. Ho trovato questo prezioso come studente perché mi permette di confrontare i diversi approcci che hanno reso evidenti i vantaggi di ML.

Tuttavia, come altri hanno menzionato, il vantaggio principale di Mathematica e OCaml è la corrispondenza del modello e non è tecnicamente correlato alla programmazione funzionale. Successivamente ho esaminato molti altri linguaggi funzionali, ma non desidero tornare a una lingua che manca di abbinamento di modelli.

Problemi correlati