2009-09-17 15 views

Odpowiedz

1

rekurencja. Trudno owinąć głowę wokół niego czasami

+5

Rzeczywiście. Zobacz tę odpowiedź tutaj: 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"); śmiech(); } Chociaż w rezultacie może powstać coś podobnego do nazwy tej strony; ^) – Toad

+0

Nie, jeśli język obsługuje rekursję ogonową.;) – mipadi

6

powiedziałbym First-class functions.

W nauce komputer, programowanie językiem mówi się wspierać funkcje pierwszej klasy (lub funkcja literały), jeśli traktuje funkcje jako obiekty pierwszej klasy. Konkretnie oznacza to, że język obsługuje konstruowaniu nowych funkcji podczas realizacji programu, przechowywanie ich w strukturach danych, przekazując je jako argumenty do innych funkcji, powracających je jako wartości innych funkcji. Ta koncepcja nie obejmuje żadnych zewnętrznych programów poza językiem i programu (metapogrobienie), takich jak wywoływanie kompilatora lub funkcji eval w celu utworzenia nowej funkcji.

+0

Czy jest przydatna? o_O –

+0

nie tylko użyteczne, ale potężne. Na przykład możesz symulować OOP, nawet jeśli dany język go nie obsługuje. Zobacz na przykład: http://javascript.crockford.com/prototypal.html –

+2

Niezbyt trudne, moim zdaniem ... Monady są z pewnością o rząd wielkości trudniejsze ... – em70

8

owijając głowę przechodzącej wokół kontynuacja stylu pomógł mój javascript kodowanie dużo

1

Koncepcja funkcji wyższego rzędu, funkcji lambda i mocy generycznych algorytmów, które są łatwe do połączenia, była dla mnie bardzo korzystna. Zawsze jestem podekscytowany, gdy widzę, co mogę zrobić z foldem w haskell. Podobnie jak moje programowanie w języku C# bardzo się zmieniło (na lepsze, mam nadzieję), ponieważ dostałem się do programowania funkcjonalnego (w szczególności haskell).

6

Czy chcesz zmierzyć użyteczność w związku z samym funkcjonalnym programowaniem lub programowaniem?

Ogólnie pozytywne doświadczenie programowania funkcjonalnego nie wynika z konkretnych technik, ale ze sposobu zmienia swoje myślenie -

  • przechowywania danych niezmienne
  • Formułowanie deklaratywnie (rekurencja, wzór dopasowywania)
  • Leczenie funkcje jak dane

Więc powiedziałbym, że programowanie funkcjonalnych jest odpowiedź na twoje pytanie sam.

Ale żeby dać bardziej konkretnej odpowiedzi też będę głosować na funkcjonalnych mechanizmów abstrakcji jak

  • monad
  • arrows
  • kontynuacją przerzucenia styl
  • zippers
  • wyższych, funkcje porządkowe
  • generics + typeclasses.

Jak już wspomniano, są bardzo abstrakcyjne rzeczy na pierwszy rzut oka, ale gdy już je rozumieć, są bardzo fajne i valueable techniki, aby napisać zwięzły, błąd bezpieczny i last but not least wysoko wielokrotnego użytku kod.

Porównaj następujące (Pseudokod):

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

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

Ten ostatni może być nieco nieintuicyjne porównaniu z pierwszą definicją, ale pozwala pracować z każdej kolekcji i typu numerycznego w ogóle!

Podsumowując, wiele nowoczesnych (głównych) języków odkryło takie korzyści i wprowadziło bardzo funkcjonalne funkcje, takie jak funkcje lambda lub Linq. Po zrozumieniu tych technik poprawi się również pisanie kodu w tych językach.

+0

Zgadzam się z pięcioma z twoich sugestii, ale # 6 (generics) nie jest specyficzny dla języków programowania funkcjonalnego - nawet np. Java obsługuje parametry typu z ograniczeniami, a zatem może wyrażać twoją sumGeneric jak wyżej. –

3

Jeden z działu "zaawansowanego": programowanie z typami fantomowymi (czasami nazywane również typami indeksowanymi). Co prawda nie jest to "standardowa" technika w programowaniu funkcjonalnym, ale też nie jest w pełni ezoteryczna i jest to coś, co sprawia, że ​​mózg jest zajęty przez jakiś czas (prosiłeś o coś trudnego, prawda?;)).

Mówiąc w skrócie, chodzi o parametryzowanie typów w celu kodowania i statycznego wymuszania pewnych właściwości podczas kompilacji. Jednym ze standardowych przykładów jest funkcja dodawania wektora, która zapewnia statycznie, że dwa wektory o długości N i M zwrócą wektor o długości N + M lub w przeciwnym razie wystąpi błąd podczas kompilacji. Tak, jest więcej ciekawych aplikacji.

Te techniki nie są tak przydatne w C++, ponieważ są w odpowiednim funkcjonalnym języku programowania, ale do tej pory udało mi się przemycić niektóre z tych rzeczy we wszystkich moich ostatnich projektach w pracy w różnym stopniu, najbardziej ostatnio w kontekście C++ EDSL, w którym to działało naprawdę dobrze. Nie koniecznie trzeba kodować fantazyjne rzeczy, uczenie się tego pomogło mi złapać sytuacje, w których kilka znaczników typu może zmniejszyć szczegółowość EDSL lub zezwolić na czystszą składnię, na przykład.

Prawdą jest, że przydatność jest nieco ograniczona przez obsługę języków i to, co próbujesz osiągnąć.

Niektóre przystawki:

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

Fun with Phantom Types

Referat Kennedy i Russo wspomniano w slajdach jest Generalized Algebraic Data Types and Object Oriented Programming i umieszcza niektóre z tych rzeczy w kontekście C#/Java.

Rozdział 3 w książce Dave'a Abrahama C++ Template Metaprogramming jest available online as sample chapter i wykorzystuje te techniki w C++ do analizy wymiarowej.

Praktycznym projektem FP wykorzystującym typy fantomowe jest HaskellDB.

Powiązane problemy