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.
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