2009-09-17 6 views

risposta

1

ricorsione. Difficile per avvolgere la testa intorno ad esso a volte

+5

Infatti. Vedere questa risposta qui: http://stackoverflow.com/questions/1438558/what-techniqie-in-functional-programming-is-difficult-to-learn-but-useful-afterwa/1438569#1438569 – skaffman

+0

laugh(); void laugh() {print ("ha"); ridere(); } Anche se ciò comporterebbe qualcosa di simile al nome di questo sito alla fine; ^) – Toad

+0

Non se la tua lingua supporta la ricorsione di coda.;) – mipadi

6

direi First-class functions.

In informatica, un linguaggio di programmazione è detto di sostenere funzioni di prima classe (o funzione letterali) se si tratta funzioni come oggetti di prima classe. Specificamente, ciò significa che la lingua supporta costruzione di nuove funzioni durante la esecuzione di un programma, la loro memorizzazione in strutture di dati, passandoli come argomenti ad altre funzioni e loro ritorno ai valori di altre funzioni. Questo concetto non copre alcun mezzo esterno alla lingua e il programma (metaprogrammazione), come ad esempio che richiama un compilatore o una funzione eval per creare una nuova funzione.

+0

È utile? o_O –

+0

non solo utile ma potente. Ad esempio è possibile simulare OOP anche se la lingua non lo supporta. Si veda ad esempio: http://javascript.crockford.com/prototypal.html –

+2

Non proprio difficile, a mio parere ... monadi sono sicuramente un ordine di grandezza più difficile ... – em70

8

confezionamento mia testa intorno continuazione stile di passaggio ha aiutato la mia javascript codifica un sacco

1

Il concetto di funzioni di ordine superiore, funzioni lambda e la potenza di algoritmi generici che sono facili da combinare sono stati molto utili per me. Sono sempre emozionato quando vedo cosa posso fare con una piega in haskell. Allo stesso modo la mia programmazione in C# è cambiata molto (per meglio, spero) da quando sono entrato nella programmazione funzionale (in particolare haskell).

6

Vuoi misurare l'utilità in relazione alla programmazione funzionale stessa o alla programmazione in generale?

In generale, l'esperienza positiva della programmazione funzionale non deriva da tecniche particolari, ma dal modo in cui cambia il vostro pensiero -

  • Tenendo dati immutabili
  • Formulazione dichiarativo (ricorsione, pattern-matching)
  • Trattamento funziona come dati

Quindi direi che la programmazione funzionale è la risposta alla tua domanda stessa.

Ma per dare una risposta più specifica troppo, avrei votato per meccanismi di astrazione funzionali come

  • monadi
  • arrows
  • continuazione-passing-style
  • zippers
  • superiore che funzioni dell'ordine
  • generici + dattiloscritti.

come già detto, sono molto astratti cose sul primo punto di vista, ma una volta che li avete capito, sono le tecniche estremamente fresco e valueable per scrivere conciso, errori di sicurezza e, ultimo ma non meno importante altamente codice riutilizzabile.

Confrontare il seguente (Pseudocodice):

// Concrete 
def sumList(Data : List[Int]) = ... 

// Generic 
def sumGeneric[C : Collection[T], T : Num](Data : C) = ... 

Il secondo potrebbe essere in qualche modo intuitivo rispetto alla prima definizione, ma permette di lavorare con qualsiasi raccolta e tipo numerico in generale!

Tutto sommato, molte lingue moderne (mainstream) hanno scoperto tali vantaggi e introdotto funzionalità molto funzionali come le funzioni lambda o Linq. Avendo compreso queste tecniche migliorerà anche il codice di scrittura in queste lingue.

+0

Concordo con i primi cinque suggerimenti, ma il numero 6 (generici) non è specifico per i linguaggi di programmazione funzionale, anche ad es. Java supporta i parametri di tipo con limiti e quindi potrebbe esprimere la tua sumGeneric come sopra. –

3

Uno dal reparto "avanzato": programmazione con tipi di fantasma (a volte chiamati anche tipi indicizzati). Non è certamente una tecnica "standard" nella programmazione funzionale, ma non del tutto esoterica, ed è qualcosa per tenere occupato il tuo cervello per un po '(hai chiesto qualcosa di difficile, giusto?;)).

In breve, si tratta di parametrizzare i tipi da codificare e applicare staticamente determinate proprietà in fase di compilazione. Uno degli esempi standard è la funzione di aggiunta vettoriale che assicura staticamente che i dati di due vettori di lunghezza N e M restituiscano un vettore di lunghezza N + M o altrimenti si verifichi un errore in fase di compilazione. Sì, ci sono altre applicazioni interessanti.

Queste tecniche non sono così utili in C++ come sono in un linguaggio di programmazione funzionale corretto, ma finora sono riuscito a introdurre alcune di queste cose in tutti i miei progetti recenti al lavoro in misura diversa, la maggior parte recentemente in un contesto C++ EDSL in cui ha funzionato molto bene. Non devi necessariamente codificare cose di fantasia, l'apprendimento di questo mi ha aiutato a cogliere le situazioni in cui alcuni tag di tipo possono ridurre la verbosità di una EDSL o consentire una sintassi più pulita, per esempio.

Certamente, l'utilità è alquanto limitata dal supporto linguistico e da ciò che si sta cercando di ottenere.

alcuni antipasti:

Generic and Indexed Type (slides with some brief applications overview)

Fun with Phantom Types

La carta Kennedy e Russo menzionato nelle diapositive è Generalized Algebraic Data Types and Object Oriented Programming e mette un po 'di questa roba nel contesto di C#/Java.

Il capitolo 3 nel libro di Dave Abraham C++ Template Metaprogramming è available online as sample chapter e utilizza queste tecniche in C++ per l'analisi dimensionale.

Un progetto FP pratico che utilizza i tipi di fantasma è HaskellDB.

Problemi correlati