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:5 dni
- Postów:3277
- Rejestracja:około 7 lat
- Ostatnio:około godziny
- Postów:876
@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:5 dni
- 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 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:mniej niż minuta
- Postów:4891
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 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
funkcja definiująca nieograniczony zbiór czasu i liczb
????funkcja definiująca nieograniczony zbiór czasu i liczb
- jeśli zdefiniuję sobie funkcjęf(x) = 1
to równie dobrze mogę zdefiniować sobie funkcjęf(x) = R
gdzie R to zbiór liczb rzeczywistych. Dla funkcji rand pure wyglądało by wtedy tak:rand(f(x))
tyle że x jest wówczas zbyteczny bof(x)
jest stałą i zawsze zwraca ten sam element.rand(f(x))
nadal nie jest pure funkcją ( o ile tylkorand(R)
nie zwraca zawsze tej samej wartości, strzelam, że rand zwracający tą samą wartość to nie jest coś o co Ci chodzi. Aczkolwiek można mieć pseudolosowość w pure fp. Jest kilka spososbów np.rand(acc) -> (x,new acc)
(za każdym razem dostajemy parę - wartość pseudolosową, i "akkumulator/stan" do wstawienia przy nastepnym wywołaniu.x
zwracać całe R, ale zwracasz to jedno całe R zawsze, a nie raz jeden element z R, innym razem inny.rand(f(x)
która jest selektorem - dokonuje wyboru ze zbioru f(x) zwracając jego jednoelementowy podzbiór. Jeślif(x)
zwróci zbiór jednoelementowy to funkcjarand(f(x))
zwróci ten sam zbiór. Jeślif(x)
będzie zbiorem dwuelementowym torand(f(x)
zwróci dowolny podzbiór jednoelementowy. Wybór nie jest deterministyczny.rand(X, y) -> X[rand(y)]
. Możesz też nie przekazywać ziarna i mieć rand(X, y) -> X[rand(now())] i wtedy będzie niedeterministyczna (co już oznacza, że nie jest funkcją), w dodatku nie jest "pure", bo pobiera dane z boku (zegar systemowy, albo inne źródło niby losowe).y
zY
. Ten element to może być zbiór oczywiście. Nic to nie zmienia.losuj(zewnątrz) -> (użyte_zewnątrz, rezultat)
IO m
.(np.IO Int
= mam inta, dzięki temu, że działałem z jakimś zewnątrz (np. wylosowane, użytkownik wpisał etc).jak jest metematycznie zdefiniowana zmienna losowa (jako funkcja od zbioru zdarzeń)
- czyli jednak da się zdefiniować matematycznie funkcję selektora i jest to czysta funkcja? Haskell mnie nie interesuje, nie trawię Comic Sansnawet wrzucić losowość z zewnątrz
- to jest jedyne prawilne rozwiązanie nie naruszające formalizmu. Ale wtedy masz system otwarty.now()
? Wg. definicji każda powinna zwrócić unikalną wartość ;)Tylko teraz co z teraz now()? Wg. definicji każda powinna zwrócić unikalną wartość 😉
gdzie masz taką definicję? i co to jest tonow()
?co ma to wspólnego z matematyczną funkcją?
W sumie tyle samo co czysta matematyka ze stosowaną. Tą pierwszą się bawimy, tej drugiej używamy.co mi da zastanawianie się nad problemem równoczesności?
- pewnie nic, funkcji ze stdbliba się używa, od problemów z ich implementacjami są ci co się bawią.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ć?