Quale sarebbe un buon primo progetto di programmazione funzionale? [chiuso]


19

Quale sarebbe un buon primo progetto di programmazione funzionale?

Sto cercando di finire col botto sul mio progetto di laurea e voglio finirlo con un progetto di programmazione funzionale. Non l'abbiamo studiato a scuola, ma siamo incoraggiati a cercare di imparare nuove cose da soli, e ho pensato che imparare un nuovo paradigma non solo una nuova lingua sarebbe stato un grande esercizio per me, e probabilmente qualcosa di interessante da vedere anche per gli insegnanti .

Il problema è che voglio iniziare un po 'in anticipo sul mio progetto per sfruttare le vacanze estive e ottenere una migliore comprensione della programmazione funzionale e acquisire familiarità con una lingua.

Quale diresti sarebbe un progetto di buone pratiche che è un po 'impegnativo, ma mi permette anche di imparare la lingua, il paradigma, ecc. E quale pensi che sarebbe un buon progetto (uno più avanzato) per il mio progetto di laurea?

Anche i suggerimenti per il miglior linguaggio con cui iniziare quando si passa alla programmazione funzionale sarebbero apprezzati.


1
"Quale lingua dovrei scegliere" e qui le domande sulla selezione dei progetti sono entrambe fuori tema. Per ulteriori dettagli, consultare le FAQ e questa meta discussione .
Adam Lear

Risposte:


10

In genere è più facile se cerchi qualcosa di relativamente matematico o logico: i linguaggi di programmazione funzionale sono generalmente adatti per applicazioni che rappresentano una forma di trasformazione da un dato input a un output.

Alcune idee, in ordine di difficoltà:

  • Algoritmi genetici: scrivi un programma che evolve soluzioni per un compito particolare in cui le soluzioni sono rappresentate in un semplice DSL. Mi sono divertito prima di costruire piccoli robot che cercano cibo in una griglia 2D e sviluppano diversi tipi di strategie

  • Combinatori di analisi: crea una libreria combinatrice di parser che ti consenta di costruire un parser per un linguaggio arbitrario usando funzioni di ordine superiore.

  • Se vuoi davvero una sfida, puoi provare a scrivere un gioco per computer ... tieni presente che questo è un compito difficile poiché i giochi hanno un'enorme quantità di stato mutevole che può essere difficile da gestire in uno stile di programmazione funzionale. Aspettatevi di imparare più di quanto avreste mai voluto sapere sulle monadi ecc ...

Consiglierei Clojure come linguaggio funzionale pragmatico. Lo uso da circa 18 mesi e sono estremamente soddisfatto della scelta. I motivi principali sono:

  • Concorrenza - Clojure ha un fantastico sistema STM che a mio avviso lo rende il miglior linguaggio al mondo al momento per la concorrenza multi-core. Guarda il video su: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey se vuoi capire perché questo è così speciale
  • È un Lisp - quindi a causa della filosofia del "codice è dato" è fantastico per la metaprogrammazione basata su macro (programmi che scrivono programmi, algoritmi genetici ecc.)
  • Programmazione funzionale pragmatica - Lo stile Clojure è molto funzionale (molta enfasi su funzioni di ordine superiore, sequenze pigre ecc.) Ma non è del tutto puro come Haskell. Esistono molti strumenti utili per gestire lo stato e gli effetti collaterali di mtable
  • Dinamico : Clojure è un linguaggio dinamico per impostazione predefinita. Trovo che questo sia un grande impulso per la produttività. Tuttavia, è possibile aggiungere facoltativamente suggerimenti di tipo statico in un secondo momento se si desidera ottenere i vantaggi in termini di prestazioni della digitazione statica.
  • Completamente compilato : il codice Clojure è sempre rispettato (anche se fai un "eval") in modo da ottenere prestazioni abbastanza decenti - sicuramente meglio della maggior parte dei linguaggi dinamici che ho usato.
  • Puoi accedere gratuitamente a tutte le librerie e gli strumenti dell'ecosistema JVM . Quindi, a differenza dei linguaggi accademici che hanno librerie molto limitate disponibili, puoi accedere a qualsiasi cosa nell'universo Java abbastanza facilmente

Puoi provare le basi molto facilmente con:


Ho scelto la tua risposta alla domanda perché ha risposto a tutte le mie domande. Grazie mille per aver dedicato del tempo.
Meme,

Anche Haskell ha STM; (
alternativa

@mikera: per lavorare con JVM, hai provato ABCL? L'ho provato e ho fatto solo un piccolo esempio, ma non ho quasi esperienza con esso. (Ho anche un libro Clojure nella mia lista di cose da fare, ma questa è un'altra storia, sono curioso di sapere se hai qualche esperienza con ABCL e Java).
Giorgio,

@Giorgio: ABCL sembra un'implementazione decente di Common Lisp su JVM. OTOH Clojure ha i vantaggi di essere progettato per la JVM, incorporando molte più innovazioni "moderne" e avendo più slancio nella comunità. Penso che dipenda dal fatto che ti interessi o meno mantenere la compatibilità con le versioni precedenti di Common Lisp.
Mikera,

9

Prima di iniziare a pensare a progetti specifici, inizia con l'apprendimento delle basi della programmazione funzionale in modo da poter avere una buona idea dei tipi di progetti che potrebbero essere adatti.

Il posto migliore per iniziare è probabilmente The Structure and Interpretation of Computer Programs (SICP), che si basa sul dialetto Scheme di Lisp. Questo è un classico testo CS e il testo completo è disponibile online (collegamento fornito).

Se vuoi essere sofisticato e utilizzare un linguaggio funzionale più moderno che si rivolge alla JVM, dai un'occhiata a Clojure. Esiste persino una versione adattata di SICP specifica per Clojure .

Esaminando il testo SICP, avrai un'idea del perché la programmazione funzionale sia così adatta a determinati tipi di attività e gli esercizi potrebbero ispirare un progetto a tutti gli effetti. Se si sceglie di andare via Clojure, e vuole esaminare alcuni progetti esistenti, ci sono alcuni link buoni qui .


Grazie per aver fornito il link per il libro. Lo leggerò per capire meglio.
Meme,

Hai letto il tuo SICP oggi?
MattyD,

3

Analisi quantitativa

Se ritieni che la finanza sia alquanto interessante fare alcune cose quantistiche con la programmazione funzionale è una buona partita poiché è molto algoritmica. Sto parlando di teoria del portafoglio e cose come i rapporti di sharpe e sortino ecc. Crea un'app che analizzi i rendimenti di un fondo e fornisca statistiche, diagrammi ecc. Diversi

Consiglierei F # solo perché penso che sia un linguaggio funzionale facile da cui iniziare, ha buoni strumenti e un buon framework che lo supporta. Altre alternative sono lisp e clojure ma sono un po 'più difficili da imparare.


Ad alto livello, è davvero vero che puoi fare molte cose in modo funzionale. Le persone hanno usato linguaggi funzionali per descrivere i pagamenti di opzioni esotiche, per esempio. Ma man mano che passi al livello del suolo, come calcolare la PCA, risolvere equazioni non lineari, ecc., Gli algoritmi diventano sempre più iterativi e stai meglio codificandoli alla vecchia maniera.
quant_dev,

1
Non direi che, nella mia esperienza, l'analisi quantitativa riguarda l'esecuzione di algoritmi su serie. Ho implementato roba quantistica in C # ed era molto allineata con LINQ, almeno per il tipo di roba di teoria del portafoglio
Homde,

E le implementazioni degli stessi algoritmi?
quant_dev,

Non vedo alcun problema nella maggior parte dei casi, vero? Prendi il calcolo di un rapporto di sharpe, prima calcola un rendimento annualizzato da una serie di rendimenti, quindi usi quel valore con un tasso privo di rischio e volatilità: (annualizedReturn - riskFreeRate) / volatilità. Niente che un linguaggio funzionale non potesse gestire
Homde,

Che dire della calibrazione del modello di prezzo?
quant_dev,

3

Per cominciare, potresti provare a implementare un piccolo gioco di blackjack in F #. Questo è un progetto di compiti assegnati durante questo breve video tutorial . La soluzione è fornita anche in rete (e in uno dei video).


2

È possibile scrivere un interprete per schema o lisp con OCaml.


Da notare anche un libro di haskell su questo schema di scrittura in haskell.
alternativa

2

A quale linguaggio funzionale stavi pensando. Ognuno ha caratteristiche diverse. L'unica lingua che ha avuto il maggiore impatto su di me è stata Haskell e ti suggerirei di fare lo stesso.


Stavo pensando a F # onestamente principalmente perché in Danimarca Microsoft è tutto popolare, ma più leggo opinioni diverse, dubito di questa decisione. Voglio una lingua che mi aiuti principalmente ad apprendere il paradigma, e dopo sono sicuro che non è difficile impararne un altro se ne ho bisogno o voglio.
Meme,

Dipende fortemente da dove sei e cosa fai. Per noi le tecnologie di programmazione Microsoft sono inutili in quanto non supportano la nostra piattaforma principale. Ma sto divagando: se vuoi usare F #, fantastico, ma poi apri una nuova domanda specifica su F #.

Non voglio usarlo. Non ho ancora preso una decisione. La domanda sulla lingua da usare era comunque secondaria.
Meme,

In tal caso, trova un progetto e chiedi consigli su come risolverlo. Ad esempio Prolog è ottimo per la ricerca dell'albero delle decisioni. Haskell è perfetto per la corrispondenza dei motivi. Lisp è ottimo per costruire e manipolare programmi Lisp in fase di esecuzione in base ai tuoi dati.

0

Potresti anche contribuire ad alcuni progetti open source.

Ad esempio, nel progetto del linguaggio di programmazione Frege , c'è molto lavoro da fare. Ad esempio, potrebbe interessarti il ​​porting delle librerie Haskell di base. Questo ti renderebbe una specie di esperto di Haskell mentre ci lavori.

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.