Pisanie programów funkcyjnych w językach czysto funkcyjnych nie jest dobrym pomysłem jeżeli dopiero zaczynasz z programowaniem.
Do zaczęcia nauki paradygmatu funkcyjnego potrzebujesz:
• Wiedzieć i rozumieć jak działa rekurencja.
• Warunkiem (bardzo) mocno zalecanym jest poznanie paradygmatu obiektowego oraz (zalecanym) strukturalnego.
• Umieć pisać funkcję oraz programy składające się z kilku funkcji aby umieć posługiwać się funkcjami.
Kilka artykułów o programowaniu funkcyjnym:
•https://4programmers.net/Inżynieria_oprogramowania/Wstęp_do_programowania_funkcyjnego#paradygmat-programowania-funkcyjnego
•http://wazniak.mimuw.edu.pl/index.php?title=Programowanie_funkcyjne/Wstęp
•https://pl.wikibooks.org/wiki/Programowanie/Programowanie_funkcyjne
•http://www.python.rk.edu.pl/w/p/funkcje-i-programowanie-funkcyjne/
Tag Archives: functional programming
Paradygmat funkcyjny – co to jest?
Paradygmat funkcyjny – co to jest?
Paradygmat funkcyjny obok kilku inny (obiektowego, strukturalnego, aspektowego, w logice) to jeden z bardziej popularnych paradygmatów programowania. W porównaniu do programowania obiektowego i strukturalnego w paradygmacie funkcyjnym nie ma pojęcia czasu jeżeli chodzi o stan pamięci w programie.W podejściu obiektowym i strukturalnym program operuje na zmiennych jako miejscach w pamięci i zmienia je w czasie. W paradygmacie funkcyjnym bardzo unika się podejścia tego typu a program jest wynikiem funkcji z przyjętymi argumentami.
Teoretycznie każdy problem da się rozwiązać w paradygmacie funkcyjnym.
Jeżeli każdy program można zapisać funkcyjnie to dlaczego znacząca większość programów jest pisana obiektowo?
Główny powód to fakt że część programów dużo łatwiej zapisać obiektowo a część dużo łatwiej funkcyjnie. Jednak tych które łatwiej zapisać obiektowo jest znacząco więcej niż tych które można zapisać funkcyjnie.
Jakie są główne trudności pisania programów funkcyjnych?
Wielokrotnie zagnieżdżona rekurencja można powodować łatwe wejście w samo-zapętlenie się programu, dodatkowo funkcja będąca dowołaniem do funkcja która jest funkcją będącą efektem wywołania kilku kolejnych funkcji sprawia że kod w ten sposób zapisany jest mało czytelny i przy większych zespołach trudniej przekazać informacje o sposobie działania kodu. Kod pisany funkcyjnie jest często dużo trudniejszy w zrozumieniu niż kod napisany obiektowo przez co przy większych projektach wydłuża się czas na zrozumienie istniejącego kodu.
Więcej o paradygmacie funkcyjnym: https://pl.wikipedia.org/wiki/Programowanie_funkcyjne
Przeplot dwóch list – Standard ML
Treść zadania:
Napisać deklarację funkcji g:int list * int list → int list, g(x, y) = przeplot list x, y liczb całkowitych
Na przykład:
g([1,4,2,5],[1,3,5,7,9,11]) = [1,1,4,3,2,5,5,7,9,11]
g([1,2,3],[4,5,6]) = [1,4,2,5,3,6]
g([1,2,3,4,5],[6,7,8]) = [1,6,2,7,3,8,4,5]
g([],[1,2,3]) = [1,2,3]
g([1,2,3],[]) = [1,2,3]
Kod źródłowy:
Przypadki testowe:
Napisać deklarację funkcji g:int list * int list → int list, g(x, y) = przeplot list x, y liczb całkowitych
Na przykład:
g([1,4,2,5],[1,3,5,7,9,11]) = [1,1,4,3,2,5,5,7,9,11]
g([1,2,3],[4,5,6]) = [1,4,2,5,3,6]
g([1,2,3,4,5],[6,7,8]) = [1,6,2,7,3,8,4,5]
g([],[1,2,3]) = [1,2,3]
g([1,2,3],[]) = [1,2,3]
Kod źródłowy:
fun append(x, y) = if null(x) then y else hd(x) :: append(tl(x), y) fun g(x, y) = if null(x) then y else if null(y) then x else append(append([hd(x)],[hd(y)]),g(tl(x),tl(y)));
Przypadki testowe:
g([1,4,2,5],[1,3,4,5,7,9,11]); g([1,2,3],[4,5,6]); g([1,2,3,4,5],[6,7,8]); g([],[1,2,3]); g([1,2,3],[]);
Sortowanie – Standard ML
Treść zadania:
Napisz dwie funkcje:
Pierwsza przyjmie za argument listę i posortuje jej elementy od najmniejszego do największego.
Druga przyjmie za argument listę i posortuje jej elementy od największego do najmniejszego.
Przykład:
sorting_low_first([10,3,7,2,9,4,5,1,8,6]) = [1,2,3,4,5,6,7,8,9,10]
sorting_hight_first([10,3,7,2,9,4,5,1,8,6]) = [10,9,8,7,6,5,4,3,2,1]
Kod źródłowy:
Dane testowe:
Napisz dwie funkcje:
Pierwsza przyjmie za argument listę i posortuje jej elementy od najmniejszego do największego.
Druga przyjmie za argument listę i posortuje jej elementy od największego do najmniejszego.
Przykład:
sorting_low_first([10,3,7,2,9,4,5,1,8,6]) = [1,2,3,4,5,6,7,8,9,10]
sorting_hight_first([10,3,7,2,9,4,5,1,8,6]) = [10,9,8,7,6,5,4,3,2,1]
Kod źródłowy:
fun insert_low_first(a,x) = if null(x) then a::[] else if a<hd(x) then a::x else hd(x)::insert_low_first(a,tl(x)) fun sorting_low_first(x:int list) = if null(x) then [] else insert_low_first(hd(x),sorting_low_first(tl(x))); fun insert_hight_first(a,x) = if null(x) then a::[] else if a>hd(x) then a::x else hd(x)::insert_hight_first(a,tl(x)) fun sorting_hight_first(x:int list) = if null(x) then [] else insert_hight_first(hd(x),sorting_hight_first(tl(x)));
Dane testowe:
sorting_low_first([10,3,7,2,9,4,5,1,8,6]); sorting_hight_first([10,3,7,2,9,4,5,1,8,6]);