Domanda

Questa è la situazione: principalmente programma C # e ho scritto dei tipi che non voglio perdere. Allo stesso tempo, vorrei imparare la programmazione funzionale. La risposta ovvia ovviamente è F #.

Ma per tutto tranne C # uso emacs come editor e mi piacerebbe davvero imparare anche Lisp. (Impara la lingua dei tuoi editor / IDE che conosci, ecco perché conosco un po 'VB per scrivere le mie macro VS in esso) E non è solo emacs, Lisp è qualcosa che voglio davvero imparare.

Per quanto riguarda F #, potrei mescolarlo con C # senza alcun problema di interoperabilità, avere un'ottima GUI (WPF) e molti altri gadget .NET. Ma ovviamente non è maturo come Lisp.

Se sono realistico so se voglio introdurre di nascosto un linguaggio funzionale nella mia vita professionale, deve essere F #. Poiché l'apprendimento di due lingue intere sembra un po 'troppo, speravo che Lisp sarebbe stato un ottimo modo per imparare la programmazione funzionale, e se avessi iniziato F # in seguito, sarebbe stato molto semplice ....

È vero? O le due lingue non sono affatto comparabili?

È stato utile?

Soluzione

Lisp è una grande famiglia di lingue e implementazioni. Lo schema, ad esempio, è un dialetto Lisp con probabilmente più di cento implementazioni (una decina delle quali leggermente popolari). Common Lisp è un altro dialetto con circa dieci implementazioni attualmente mantenute. Scheme e Common Lisp hanno entrambi standard scritti che le implementazioni cercano di attuare.

F # è sia una lingua che un'implementazione. Da Microsoft. Deriva principalmente dall'OCAML e appartiene alla famiglia delle lingue ML.

Lisp era un linguaggio molto antico a supporto della programmazione funzionale (Lisp 1.5 negli anni '60). Molti dei primi esperimenti con la programmazione funzionale sono stati fatti in Lisp. Negli anni '70 nella comunità Lisp ci fu un movimento alle radici della programmazione funzionale e il risultato fu Schema . Quindi specialmente negli anni '80 e '90 del secolo scorso apparvero nuovi linguaggi funzionali (ML, Miranda, FP, SML, Haskell, Clean, ...) che erano / sono abbastanza diversi dai soliti dialetti Lisp. C'è ancora un po 'di eredità, ma per lo più si sono sviluppati in direzioni diverse (tipizzazione statica, inferenza di tipo, sistemi di moduli, linguaggi batch, tipi di dati algebrici, valutazione pigra, purezza e altro). La comunità Scheme ha ancora molti contatti con la comunità FP. Ma è per lo più.

Ci sono alcune idee di base sul FP che possono essere apprese indipendentemente da un particolare linguaggio FP, ma generalmente F # è molto diverso dalla maggior parte dei dialetti Lisp. L'altra caratteristica, che F # supporta l'ecosistema .net (soprattutto perché è una creazione Microsoft), non è ben supportata dai dialetti Lisp.

Inoltre, non mi aspetterei grandi benefici dalla conoscenza di un dialetto Lisp limitato come Emacs Lisp per l'apprendimento di F #.

Altri suggerimenti

Penso che ci sia solo una piccola 'sovrapposizione' per ciò che avresti imparato tramite Common Lisp contro F #. La comunanza è che penso all'incirca

  • Programmazione con "contro-liste" come un comune tipo di dati fondamentali, talvolta scrivendo funzioni ricorsive (specialmente ricorsive di coda) piuttosto che loop
  • Alcuni usi di base di funzioni comuni di ordine superiore (ad esempio "mappa": applica una funzione a tutti i valori in un elenco)

A parte alcune di quelle cose fondamentali di programmazione funzionale, penso che Common Lisp e F # siano distanti l'uno dall'altro quanto due linguaggi 'funzionali' (non Haskell) tradizionali. Il Lisp comune è dinamico; F # è tipizzato staticamente. Le forme sintattiche sono completamente diverse. I tempi di autonomia sono completamente diversi. Le librerie sono molto diverse. I sistemi di oggetti sono completamente diversi.

Indipendentemente dall'ordine in cui li impari, penso che dopo averne appreso uno ci sarà ancora un po 'di più da imparare nell'altro (modulo la piccola sovrapposizione che ho descritto sopra).

F # è paragonabile alla famiglia di lingue ML, come SML e CAML. La sintassi e le caratteristiche sono diverse da Lisp.

Ma penso che imparare almeno un linguaggio funzionale sia davvero importante dal punto di vista dell'informatica. Essere in grado di pensare in questo modo è buono.

E, direi, imparare un linguaggio più puramente funzionale prima di iniziare F # sarebbe un modo per acquisire buone abitudini di programmazione funzionale perché, in caso contrario, il tuo codice F # potrebbe finire per essere più OO e meno funzionale, perché è da lì che vieni.

A mio avviso, esistono due approcci all'apprendimento della programmazione funzionale:

  1. Utilizza un linguaggio funzionale più puro come Lisp o Haskell che forza a uscire da una procedura mentalità immediata; o

  2. Utilizza un linguaggio funzionale pragmatico come F # che offre anche di più familiare, ma meno funzionale, costruisce per aiutarti a facilitarti.

In entrambi i casi, otterrai di più dall'esperienza di apprendimento se puoi fare qualcosa di utile con la lingua. Sembra che tu abbia la motivazione per Lisp (Emacs) e F # (interoperabilità .NET), quindi darei un'occhiata a entrambi e vedo cosa cattura la tua attenzione.

In definitiva, c'è più valore nella comprensione dei concetti di programmazione funzionale (funzioni di ordine superiore, nessun effetto collaterale, ricorsione della coda, ecc.) di qualsiasi altra lingua. E una volta appresi questi concetti, sarà molto più semplice acquisire nuove lingue e applicare le tecniche in altre lingue (come il C # sempre più funzionale). In tal senso, potresti essere interessato a Programmazione funzionale per il mondo reale .

Due cose importanti da considerare sono:

  • LISP viene digitato in modo dinamico mentre F # viene digitato staticamente.
  • LISP ha macro incorporate. F # no.

Sebbene entrambi siano considerati funzionali e condividano molte caratteristiche comuni, sono anche diversi. Imparare LISP ti renderà sicuramente un programmatore F # migliore e viceversa, ma dovresti comunque imparare le peculiarità di entrambi per poter essere pratico in essi.

Per poter interagire con .NET certamente sceglierei F # ma per motivi di bellezza della programmazione proverei anche LISP.

Sono entrambi linguaggi funzionali ma sintatticamente sono molto diversi. Ciò significa che molti dei concetti saranno simili e tu (come sviluppatore procedurale) dovrai fare lo stesso rompicapo per usare entrambi ma sono linguaggi molto diversi.

F # è un derivato di ML (che è considerato, con tutto il suo derivati, essere un linguaggio funzionale impuro) mentre Lisp è più vecchio ed è considerato essere un "puro" linguaggio funzionale.

La purezza di un linguaggio funzionale è un argomento affascinante e consiglierei di leggere Purezza del linguaggio e funzioni sporche e pulite per comprendere meglio il concetto:

  

Molte persone parlano di " puro "   linguaggi funzionali, dove "puro"   sembra essere sinonimo di "buono".   Ci sono due tratti comunemente   associato alla definizione di a   linguaggio funzionale puro:

     
      Le funzioni
  1. non possono avere effetti collaterali
  2.   
  3. una funzione chiamata con qualsiasi dato argomento restituirà sempre lo stesso   valore.
  4.   

Sono nuovo di F #, ma ho studiato Lisp prima di F # e credo che sia stato molto utile nel contestualizzare F # sia all'interno del framework .NET sia nella gamma dei linguaggi di programmazione.

Consiglio vivamente di guardare almeno i primi video qui:

http://groups.csail.mit. edu / mac / classes / 6.001 / Abelson-Sussman-lezioni /

Questi ti insegnano le basi di Lisp entro la prima ora. La serie si basa su quella conoscenza e infonde i principi eccitanti che emergono da lì.

La semantica di F # e Scheme sono molto simili con l'eccezione nota della tipizzazione forte.

Inoltre, Scheme è così piccolo, non per impararlo!

Come linguaggio di programmazione Lisp è piuttosto speciale, ma non è affatto simile a F # tranne per il fatto che entrambi supportano la programmazione funzionale. Non molti costrutti di linguaggio vengono trasferiti da Lisp a F #. Se vuoi imparare lisp, provalo. L'idea della programmazione funzionale riporterà non solo la sintassi. Lisp è davvero vecchio, alla fine degli anni '50. Molte lingue ne sono state influenzate e ci sono parecchi dialetti.

Se stai solo cercando un linguaggio funzionale puro da imparare prima di F #, suggerirei Haskell. Haskell è stato pesantemente influenzato da ML ed è un buon linguaggio di transizione a F # poiché F # è un derivato di ML. Puoi guardare il codice Haskell e vedere modelli simili nel codice F #.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top