Questa domanda è ovviamente ispirata allo Monads in Haskell.Quale tecnica nella programmazione funzionale è difficile da apprendere ma utile in seguito?
risposta
ricorsione. Difficile per avvolgere la testa intorno ad esso a volte
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
laugh(); void laugh() {print ("ha"); ridere(); } Anche se ciò comporterebbe qualcosa di simile al nome di questo sito alla fine; ^) – Toad
Non se la tua lingua supporta la ricorsione di coda.;) – mipadi
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.
È utile? o_O –
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 –
Non proprio difficile, a mio parere ... monadi sono sicuramente un ordine di grandezza più difficile ... – em70
confezionamento mia testa intorno continuazione stile di passaggio ha aiutato la mia javascript codifica un sacco
Direi che Structural typing in OCaml è particolarmente gratificante.
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).
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.
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. –
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)
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.
- 1. La maggior parte del linguaggio logico-funzionale più utile e istruttivo da apprendere
- 2. ciclo infinito nella programmazione funzionale?
- 3. programmazione funzionale in R
- 4. test in programmazione funzionale
- 5. Qual è zip (programmazione funzionale?)
- 6. Comprendere la sequenza nella programmazione funzionale
- 7. Gli "algoritmi" esistono nella programmazione funzionale?
- 8. Haskell - Guida alla programmazione funzionale
- 9. Quale linguaggio di programmazione funzionale dovrei scegliere come primo linguaggio di programmazione funzionale?
- 10. Progettazione basata su domini nella programmazione funzionale?
- 11. Accesso da un paradigma di programmazione funzionale
- 12. Come posso apprendere una programmazione DirectShow?
- 13. Programmazione funzionale in C/C++?
- 14. Programmazione funzionale per algoritmi di base
- 15. Qual è l'errore nella query di seguito?
- 16. Programmazione funzionale negli impianti nucleari?
- 17. Programmazione guidata evento funzionale
- 18. Ordinamento in linguaggi di programmazione funzionale
- 19. Linguaggi di programmazione funzionale introspezione
- 20. Quale funzione di gc_collect_cycles è utile?
- 21. Programmazione reattiva funzionale in Scala
- 22. Tutte le funzioni pure nella programmazione funzionale sono continue?
- 23. Python: Lista Comprensione e programmazione funzionale
- 24. È la programmazione reattiva funzionale AngularJS?
- 25. Quanto è difficile passare da un pensiero OOP a un pensiero di programmazione orientato alla funzionalità pura in .NET?
- 26. Cosa sostituisce il pattern MVC nella programmazione funzionale?
- 27. La programmazione funzionale deve essere insegnata prima della programmazione imperativa?
- 28. Confusione funzione di programmazione funzionale
- 29. Gli effetti collaterali sono possibili nella pura programmazione funzionale
- 30. Macchina per la programmazione funzionale
dopo un periodo di monadi in haskell, ancora non capisco. <> –