Argomenti per la programmazione funzionale [chiuso]


10

Recentemente sto imparando F # per divertimento (sono un sviluppatore VB.NET/C#) e mi piace molto ciò che ha da offrire. Teoricamente questo è. Ma ho problemi a pensare a scenari in cui sceglierei di codificare in F # piuttosto che in C #. Qualche idea?


2
F#non è pienamente rappresentativo della programmazione funzionale. Prova Clojureinvece.
Giobbe

1
Non conosco F #, ma uso Haskell ogni volta che voglio far saltare la mente. Ha funzionato ogni volta finora;)

1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey è un ottimo video su questo argomento (OO vs. Funzionale)
mikera

Un linguaggio funzionale dinamico? Puoi averne quanti ne vuoi. : P
Erik Reppen,

Risposte:



6

Ho problemi a pensare a scenari in cui sceglierei di codificare in F # piuttosto che in C #. Qualche idea?

Da qui :

Server asincroni

  • Flussi di lavoro asincroni per l'IO asincrono.
  • Processore di cassette postali per il passaggio di messaggi thread-safe.
  • Tipi di unione per lo stato del server e il catalogo dei messaggi.
  • Pattern matching e ricorsione della coda per le macchine a stati.

Metaprogrammazione (ad es. Analisi)

  • Generatori di parser come fslex e fsyacc.
  • Combinatori di parser come FParsec.
  • Motivi attivi per eleganti parser arrotolati a mano.
  • Tipi di dati algebrici per rappresentare alberi di analisi.
  • Corrispondenza di motivi per manipolare alberi, ad esempio applicare fasi di ottimizzazione.
  • Riflessione per la generazione runtime di codice veloce.

Informatica tecnica

  • Funzioni di ordine superiore per un codice algoritmico elegante e veloce.
  • Tipi di dati algebrici e pattern matching per manipolazione simbolica.
  • Interoperabilità per numerose librerie .NET.
  • Interattività tramite F # interattivo.
  • Espressioni di calcolo per massaggiare dati.
  • Unità di misura per una migliore correttezza.

Applicazioni GUI

  • Modello come messaggio asincrono che passa tra il codice dell'interfaccia utente e il codice della logica dell'applicazione.
  • Le funzioni di ordine superiore consentono di definire le interfacce utente in modo dichiarativo.

Programmazione logica

  • Collezioni persistenti per un facile backtracking.
  • La coda richiede affidabilità.
  • Generalizzazione automatica per una facile programmazione generica.

analisi

  • Esegui test unitari in modo interattivo.
  • BDD significa scrivere un interprete.
  • Buon linguaggio di scripting per la scrittura di cablaggi di prova e la visualizzazione dei risultati.

Prestazione

  • inline per un'astrazione gratuita di ordine superiore.
  • La coda richiede macchine a stato veloce.
  • Strutture di dati puramente funzionali per bassa latenza.
  • Metaprogrammazione per la generazione di codice ottimizzato.

Devo ammettere che non conosco F # o C # ma suggerirei di passare qualche giorno in F # e vedere cosa ne pensi. Per me usare il REPL è una vittoria importante in qualsiasi lingua che lo supporti
Zachary K,

5

Ecco a cosa serve la programmazione in stile funzionale, più o meno quotidianamente.

Facciamo molte cose statistiche e attuariali con set di dati abbastanza grandi. I dati recuperati dal database sono - essenzialmente oggetti statici, immutabili. Nessun motivo per creare una classe con metodi.

Ogni fase del calcolo aggiunge alcuni dettagli aggiuntivi, ma essenzialmente non muta l'oggetto. Alla "fine" della pipeline stiamo davvero facendo una riduzione eccezionale per calcolare somme e conteggi e altre cose.

Immagina questo.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

Ogni "fase" del calcolo è un ciclo di programmazione funzionale che esegue la lettura-calcolo-rendimento semplice e crea un oggetto composito di altre cose oltre ai risultati.

(Usiamo Python, quindi la programmazione funzionale usando le funzioni del generatore.)

È più facile usare oggetti stateless e immutabili.


Python ha un equivalente a questo F #? criteria() |> some_query |> calculate |> enrich |> summarizeTrovo che l'operatore di pipa diretto possa portare a un codice più chiaro ma sto divagando.
ChaosPandion,

@ChaosPandion: in primo luogo, questa sintassi mi confonde. Ad alcune persone sembra piacere. Ci sono innumerevoli pacchetti Python. Sono sicuro che potresti cercarlo su SO e trovare una risposta.
S. Lott,

@Chaos: Non che io sappia. di solito compongo mapper ottenere lo stesso effetto.
Paul Nathan,

4

Tecnicamente, non è una proprietà unica di una programmazione funzionale e F # non è un linguaggio funzionale puro. F #, come uno dei discendenti ML, fornisce un eccellente pattern matching e tipi di dati algebrici. Quindi, per qualsiasi attività che richieda strutture dati complesse, F # è molto più espressivo e facile da usare rispetto a C #.

Immagina di implementare un compilatore in C # e F #: rappresentare un albero di sintassi astratto e trasformarsi su di esso è molto più semplice se il tuo linguaggio fornisce ADT e un pattern matching.


2

Ideale per il tipo di riduzione della mappa di un massiccio multi-sistema e un enorme parallelismo multi-core. Abbastanza bello, considerando che al giorno d'oggi i server entry level sono dotati di 48 core (96 conteggio HT).


2

Se vuoi una funzionalità completa prova Haskell, Erlang ha anche delle cose molto interessanti.

Simon Payton-Jones ha detto di Haskell, vuole avere un programma che ovviamente non ha bug, piuttosto che non ha ovvi bug.

(Probabilmente ho un po 'staccato la citazione, ma hai avuto l'idea)

Vincolando gli effetti collaterali rendi molto più semplice dimostrare che il tuo codice è corretto.


1

Un chiaro vantaggio è che è molto più facilmente parallelizzato.


2
Stai parlando di purezza e un evidente svantaggio è che la purezza tende a rendere i programmi molto più lenti. Quindi parallelo + puro non è necessariamente una buona cosa.
Jon Harrop,
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.