Wiele współczesnych języków programowania obsługuje pewne pojęcia zamknięcia , np. Fragmentu kodu (bloku lub funkcji)
- Może być traktowany jako wartość, a zatem przechowywany w zmiennej, przekazywany do różnych części kodu, definiowany w jednej części programu i wywoływany w zupełnie innej części tego samego programu.
- Może przechwytywać zmienne z kontekstu, w którym są zdefiniowane, i uzyskiwać do nich dostęp, gdy zostaną później wywołane (być może w zupełnie innym kontekście).
Oto przykład zamknięcia napisanego w Scali:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
Literał funkcji x => x >= lowerBound
zawiera wolną zmienną lowerBound
, która jest zamknięta (powiązana) argumentem funkcji filterList
o tej samej nazwie. Zamknięcie jest przekazywane do metody bibliotecznej filter
, która może wywoływać ją wielokrotnie jako normalną funkcję.
Czytałem wiele pytań i odpowiedzi na tej stronie i, o ile rozumiem, termin zamknięcie jest często automatycznie kojarzony z programowaniem funkcjonalnym i stylem programowania funkcjonalnego.
Definicja programowania funkcji na wikipedii brzmi:
W informatyce programowanie funkcjonalne jest paradygmatem programowania, który traktuje obliczenia jako ocenę funkcji matematycznych i unika stanu i zmiennych danych. Podkreśla zastosowanie funkcji, w przeciwieństwie do imperatywnego stylu programowania, który podkreśla zmiany stanu.
i dalej
[...] w kodzie funkcjonalnym wartość wyjściowa funkcji zależy tylko od argumentów wprowadzonych do funkcji [...]. Wyeliminowanie efektów ubocznych może znacznie ułatwić zrozumienie i przewidywanie zachowania programu, co jest jedną z kluczowych motywacji rozwoju programowania funkcjonalnego.
Z drugiej strony wiele konstrukcji zamknięcia dostarczonych przez języki programowania pozwala zamknięciu na przechwytywanie zmiennych nielokalnych i zmianę ich po wywołaniu zamknięcia, powodując w ten sposób efekt uboczny dla środowiska, w którym zostały zdefiniowane.
W tym przypadku zamknięcia wprowadzają pierwszą ideę programowania funkcjonalnego (funkcje są pierwszorzędnymi jednostkami, które można przenosić jak inne wartości), ale pomijają drugą ideę (unikanie skutków ubocznych).
Czy takie użycie zamknięć ze skutkami ubocznymi jest uważane za funkcjonalny styl, czy też zamknięcia są uważane za bardziej ogólną konstrukcję, którą można stosować zarówno w funkcjonalnym, jak i niefunkcjonalnym stylu programowania? Czy jest jakaś literatura na ten temat?
WAŻNA UWAGA
Nie kwestionuję przydatności efektów ubocznych ani zamykania się z efektami ubocznymi. Nie jestem również zainteresowany dyskusją na temat zalet / wad zamknięć z efektami ubocznymi lub bez nich.
Interesuje mnie tylko to, czy stosowanie takich zamknięć jest nadal uważane za styl funkcjonalny przez zwolennika programowania funkcjonalnego, czy też przeciwnie, ich stosowanie jest zniechęcane podczas używania stylu funkcjonalnego.