Mam pytanie dotyczące czystych funkcji. Według strony Wikipedii jednym z wymogów czystej funkcji jest:
Ocena wyniku nie powoduje semantycznie obserwowalnego efektu ubocznego lub wyjścia, takiego jak mutacja obiektów podlegających mutacji lub wyjście do urządzeń I / O.
Co to naprawdę oznacza? A raczej jak mogę wywołać efekt uboczny, który nie jest semantycznie obserwowalny?
functional-programming
semantics
Henrik Sommerland
źródło
źródło
Odpowiedzi:
Semantyka programu to model jego zachowania, który, jak każdy model naukowy, ignoruje aspekty, których nie chcesz studiować.
Niezwykle szczegółowy model wykonania programu modelowałby fizyczne zachowanie komputera, który go wykonuje, w tym czas wykonania, zużycie energii, promieniowanie elektromagnetyczne itp. Takie aspekty są bardzo rzadko brane pod uwagę, ponieważ bardzo rzadko są istotne. Niemniej jednak mają one czasem znaczenie: przydatny model autopilota samolotowego musi zawierać informacje o czasie wykonywania, przydatny model bezpieczeństwa karty kredytowej musi obejmować promieniowanie elektromagnetyczne, ...
W typowej semantyce działania niepożądane, takie jak czas i zużycie energii, są ignorowane. Nawet jeśli w przyziemnym otoczeniu, w którym wpisujesz wyrażenie w wierszu interpretera Haskell, wydruk wyniku jest efektem ubocznym (jeśli spróbujesz wydrukować nieskończony obiekt, ma to znaczenie). Jeśli w interpretatorze Haskella zabraknie pamięci, jest to również zauważalny efekt uboczny w modelu „realnym”, ale nie w wyidealizowanym modelu Haskella, który skutecznie pozwala na nieograniczone obliczenia.
Zaobserwować efekt uboczny jest taki, który jest wzorowany na semantyce. W typowych modelach języków programowania zużycie pamięci nie jest modelowane, więc obliczenia wymagające 1 TB pamięci masowej mogą być czyste, nawet jeśli próba uruchomienia ich na komputerze PC wyraźnie się nie powiedzie.
Innym rodzajem nieobserwowalnego efektu ubocznego jest efekt wewnętrzny. Sądzę, że o tym pomyślałaby większość semantystów, mówiąc o nieobserwowalnych skutkach ubocznych. Rozważ obliczenia, które wewnętrznie wykorzystują zmienne dane, ale nie dzielą się tymi zmiennymi danymi z żadną inną częścią programu. Na przykład funkcja sortowania listy, która buduje tablicę z tymi samymi elementami co lista, sortuje tablicę w miejscu i zwraca listę zawierającą elementy jako tablicę w ich ostatecznej kolejności: semantyczny model podwyrażeń tej funkcji pokazuje stronę efekty (modyfikacje tablicy), ale sama funkcja nie ma zewnętrznego efektu ubocznego, więc jest czysta.
Dla bardziej subtelnego przykładu rozważmy funkcję, która zapisuje niektóre dane do pliku tymczasowego i czyści po sobie. W semantyce, w której zawsze jest wystarczająco dużo miejsca na pliki tymczasowe, a programy nie współużytkują plików tymczasowych, funkcja nie ma skutków ubocznych; plik tymczasowy działa jako dodatkowa pamięć używana przez funkcję. W semantyce, która uwzględnia pełne warunki systemu plików, funkcja ma efekt uboczny - może się nie powieść z powodu zewnętrznych okoliczności. W semantyce, która pozwala na awarię maszyny, funkcja ma efekt uboczny: jeśli wystąpi awaria podczas wykonywania funkcji, plik tymczasowy może pozostać. W semantyce, która pozwala współbieżnie wykonywanym programom zobaczyć i być może zmodyfikować plik tymczasowy, funkcja ma efekt uboczny.
źródło