Argomenti per la programmazione funzionale [chiusa]

10

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

    
posta System Down 21.02.2011 - 23:10
fonte

7 risposte

14

Alcuni argomenti per la pura programmazione funzionale:

  • È più facile suddividere le attività per i sistemi multi-core di oggi
  • È più facile dimostrare che il tuo programma è corretto
  • La composizione funzionale può essere sorprendente, concisa e potente

Per un trattamento completo, vedi Perché la programmazione funzionale è importante e Perché perché gli argomenti di programmazione funzionale sono importanti .

    
risposta data 21.02.2011 - 23:26
fonte
6

I'm having trouble thinking up of scenarios where I would choose to code in F# rather than in C#. Any ideas?

Da qui :

Server asincroni

  • Flussi di lavoro asincroni per l'IO asincrono.
  • Processore di cassette postali per il passaggio dei messaggi sicuro da thread.
  • Tipi di unione per lo stato del server e il catalogo dei messaggi.
  • Pattern matching e tail ricurva per le macchine a stati.

Metaprogramming (ad esempio analisi)

  • Generatori di parser come fslex e fsyacc.
  • Combinatori di parser come FParsec.
  • Modelli attivi per parser raffinati fatti a mano.
  • Tipi di dati algebrici per rappresentare alberi di analisi.
  • Pattern matching per manipolare gli alberi, ad es. applica le fasi di ottimizzazione.
  • Riflessione per la generazione di runtime di codice veloce.

Informatica tecnica

  • Funzioni di ordine superiore per codice algoritmico elegante e veloce.
  • Tipi di dati algebrici e pattern matching per la manipolazione simbolica.
  • Interoperabilità per ricchezza di librerie .NET.
  • Interattività usando F # interattivo.
  • Espressioni di calcolo per i dati massaggianti.
  • Unità di misura per migliorare la correttezza.

Applicazioni GUI

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

Programmazione logica

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

Test

  • Esegui i test delle unità in modo interattivo.
  • BDD significa scrivere un interprete.
  • Un buon linguaggio di scripting per scrivere cablaggi di prova e visualizzare i risultati.

Prestazioni

  • inline per astrazione di ordine superiore priva di costi.
  • Chiamate di coda per macchine a stati veloci.
  • Strutture dati puramente funzionali per bassa latenza.
  • Metaprogramming per la generazione di codice ottimizzato.
risposta data 28.02.2012 - 12:34
fonte
5

Ecco a cosa serve la programmazione in stile funzionale - su base più o meno giornaliera.

Facciamo un sacco di cose statistiche e attuariali con dataset abbastanza grandi. I dati recuperati dal database sono oggetti essenzialmente immutabili e statici. Nessun motivo per creare una classe con metodi.

Ogni fase del calcolo aggiunge alcuni dettagli aggiuntivi, ma in sostanza non modifica l'oggetto. Alla "fine" della pipeline stiamo davvero facendo una fantasia riduci 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 una semplice lettura-calcolo-rendimento e crea un oggetto composito di altre cose più i risultati.

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

È più facile usare oggetti stateless e immutabili.

    
risposta data 21.02.2011 - 23:27
fonte
4

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

Immaginare di implementare un compilatore in C # e F # - rappresentare un albero di sintassi astratto e trasformarlo è molto più semplice se la tua lingua fornisce ADT e un pattern matching.

    
risposta data 22.02.2011 - 00:20
fonte
2

Ideale per la riduzione della mappa di un massiccio multi-sistema e di un massiccio parallelismo multi-core. Piuttosto interessante, considerando che oggigiorno i server entry level arrivano con 48 core (96 conteggio HT).

    
risposta data 22.02.2011 - 00:51
fonte
2

Se vuoi provare a funzionare pienamente con Haskell, anche Erlang ha delle cose molto interessanti.

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

(Probabilmente ho preso la citazione un po ', ma tu hai capito l'idea)

Limitando gli effetti collaterali rendi molto più facile dimostrare che il tuo codice sia corretto.

    
risposta data 22.02.2011 - 05:25
fonte
1

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

    
risposta data 21.02.2011 - 23:23
fonte

Leggi altre domande sui tag