Idziecie w jakieś filozoficzne rozważania. Funkcja w programowaniu funkcyjnym jest pojęciem prawie tożsamym z definicją matematyczną. Prawie, bo jednak nie wszystkie funkcje są "pure", np. now()
, rand()
.
Program funkcyjny to w założeniu funkcja złożona np. f(g(h(x)))
, gdzie wynik h(x) jest parametrem g(), a wynik g() jest parametrem f(). Wyjątek rzucony z h() nie zostanie zwrócony jako parametr do g() i do h(). Dlatego rzucanie wyjątkami nie jest zgodne z "duchem" programowania funkcyjnego.
- 1
- 2

- Rejestracja:ponad 7 lat
- Ostatnio:dzień
- Postów:3277
- Rejestracja:około 7 lat
- Ostatnio:13 minut
- Postów:870
@piotrpo zakładając, że rzucone wyjątki są częścią return value
to nie widzę powodów dlaczego wyjątki mogą nie być pure. Zarówno mamy zachowaną czystość (ten sam wynik dla tych samych argumentów) jak i referential transparency (wykluczając oczywiście stack traces)

- Rejestracja:ponad 7 lat
- Ostatnio:dzień
- Postów:3277
Ale cała dyskusja toczy się wokół wyższości Wielkanocy nad Gwiazdką either
nad throw
. Zwracanie wyjątku w postaci return value
, czyli opakowanego w either
oznacza, że funkcja zwraca wciąż tę samą strukturę, jedynie z innymi wartościami. W matematyce przecież funkcja również nie musi zwracać koniecznie liczby rzeczywistej, może być liczba złożona, tensor czy inny kwaternion.






- Rejestracja:ponad 8 lat
- Ostatnio:około 3 godziny
- Lokalizacja:U krasnoludów - pod górą
- Postów:4707
slsy napisał(a):
@piotrpo zakładając, że rzucone wyjątki są częścią
return value
to nie widzę powodów dlaczego wyjątki mogą nie być pure. Zarówno mamy zachowaną czystość (ten sam wynik dla tych samych argumentów) jak i referential transparency (wykluczając oczywiście stack traces)
Tak, wyjątki zwrócone przez return value są zasadniczo pure.
Impure jest tylko jak są rzucone przez throw.
return new Exception
zwrócić obiekt exceptiona returnem? nigdy czegoś takiego nie widziałem na oczy.


- Rejestracja:prawie 5 lat
- Ostatnio:4 miesiące
- Postów:2420
powoduje side-effect, więc funkcja nie jest już 'pure'
Jeżeli wyjątek powoduje site effect to return
tym bardziej go powoduje. Jeżeli wyjątek powoduje terminacje programu to tym bardziej wyjście z metody main
.
powoduje, że tracimy 'referential transparency'
Tego punktu nie łapę, można zastąpić foo()
throw new FooException()
i będzie Git. Nie można tutaj mówić że nie spełnia referential transparency.
Niestety jest to 99 wątek tego rodzaju na 4p. Moderacja powinna wziąć się do roboty i zacząć stemplować [Duplicate]
tak jak to robią na SO...

- Rejestracja:około 8 lat
- Ostatnio:około 2 godziny
- Postów:4886
Jeżeli wyjątek powoduje site effect to return tym bardziej go powoduje.
Jak, return to normalne wyjście z funkcji i nie powoduje side effects, za to wyjątek jak najbardziej.
Tego punktu nie łapę, można zastąpić foo() throw new FooException() i będzie Git.
Co będzie git, przecież jeśli oczekujemy wyniku, np. liczby, to tracimy referential transparency, chyba, że zawsze rzucamy wyjątek.

- Rejestracja:ponad 8 lat
- Ostatnio:około 3 godziny
- Lokalizacja:U krasnoludów - pod górą
- Postów:4707
99xmarcin napisał(a):>
Tego punktu nie łapę, można zastąpić
foo()
throw new FooException()
i będzie Git. Nie można tutaj mówić że nie spełnia referential transparency.
Nie można. Referential transparency oznacza, że możesz zamienić wywołanie funkcji przez wartość funkcji w punkcie. throw new FooException()
nie jest wartością. Nie możesz np. podstawić tego pod zmienną. Możesz podstawić samo new FeeException()
ale to już będzie działać inaczej.
Niestety jest to 99 wątek tego rodzaju na 4p. Moderacja powinna wziąć się do roboty i zacząć stemplować [Duplicate] tak jak to robią na SO...
Raczej powinniśmy pisać. Było, użyj opcji szukaj
. Dzięki temu odbudujemy popularność portalu.
- Rejestracja:ponad 3 lata
- Ostatnio:5 miesięcy
- Postów:7
@jarekr000000: Tak przeszukiwałem całe forum w poszukiwaniu odpowiedzi na swoje pytanie, ale im dłużej czytałem tym mniej byłem pewien co jest prawdą a co nie. W każdym razie dziękuję wszystkim za opinie - wybiorę sobie z nich swoją wersje prawdy.
- 1
- 2
Opiera się zasadniczo na czystych matematycznych funkcjach
- no to nie dziwię się że czasami możesz mieć problem z definicjami. @piotrpo:jakieś wyrażenie algebraiczne zwracało dla tych samych danych różne wyniki
- ja wciąż się zastanawiam jak oni wszyscy notują wyrażenie selektora (czyli aksjomat wyboru). Bo selektor z natury zwraca podzbiór ale jego zachowanie może być definiowane zewnętrznie. Jak żyć?