Wpis z mikrobloga

@boostasio: W dużym skrócie programowanie funkcyjne opiera się na braku stanu i niemutowalnych obiektach i funkcjach jako "first-class objects". W funkcjonalnym kodzie wartości funkcji zależą tylko od jej argumentów i nie mają żadnych efektów ubocznych.

https://en.wikipedia.org/wiki/Functional_programming

Dobrym przykładem języka który realizuje te założenia jest np haskell:
https://en.wikipedia.org/wiki/Haskell_%28programming_language%29
  • Odpowiedz
Oczywiście od tych zasad są wyjątki w praktycznie każdym funkcyjnym języku programowania (Haskell ma monady, Erlang ma procesy, Clojure ma set!, etc.), ale większość kodu będzie im podlegała.
  • Odpowiedz
@boostasio: przede wszystkim, łatwiej testować. Bo jeśli wartość zwracana przez funkcję zależy tylko i wyłącznie od argumentów, to nie masz sytuacji gdy jakaś zapomniana globalna zmienna powoduje, że funkcja zmienia swoje zachowanie. Przykład w Elixirze, bo ma rebindowanie zmiennych:

a = 1
foo = fn b -> a + b end
a = 2
foo.(10) == 11 # Bo a jest dalej równe 1 wewnątrz lambdy foo
  • Odpowiedz
@boostasio: chodzi o to, że a w pierwszym i drugim przypadku zostanie zamienione na osobne zmienne (Erlang ma pojedyncze przypisanie, nie da się tego tak zapisać). Więc "pod spodem" wygląda to tak

A1 = 1,
Foo = fun(B) -> A1 + B end,
A2 = 2, % A1 = 2 wyrzuci błąd, że nie można dopasować 1 = 2
Foo(10)
  • Odpowiedz
@boostasio: Jest kilka zasad.
1. Functions are Pure - funkcja wołana kilka razy z takimi samymi argumentami, zawsze zwróci ten sam wyniki. Funkcja nie ma efektów ubocznych, nic nie zmienia w stanie programu, itp.
2. Functions are First-Class and can be Higher-Order - funkcje są traktowane na równi z wartościami i mogą przyjmować inne funkcje jako parametry lub zwracać inne funkcje jako wynik.
3. Variables are Immutable - było już
  • Odpowiedz