Jednym z założeń programowania funkcjonalnego jest stosowanie funkcji czystych. Funkcja Pure to taka, która nie powoduje skutków ubocznych i jest względnie przezroczysta.
Gettery nie są referencyjnie przezroczyste - jeśli Setter jest wywoływany między wywołaniami Gettera, wartość zwrotna Gettera zmienia się, mimo że jego parametry nie (zwykle nie ma parametrów)
Setery wywołują skutki uboczne - Wywołanie Setera zwykle manipuluje wartością, która nie jest jego wartością zwracaną (w rzeczywistości, tradycyjnie setter nic nie zwraca)
Wiem, że w Scali po prostu akceptujemy fakt, że łączymy ze sobą dwa paradygmaty (funkcjonalny i obiektowy) i używamy getterów / setterów tak, jak robilibyśmy w języku takim jak Java.
W języku takim jak Haskell (z którym nie jestem biegły, ale powiedziano mi, że bardziej odpowiada „czystemu” językowi funkcjonalnemu) jestem po prostu ciekawy, w jaki sposób można modelować właściwości obiektów, tak aby Getters były referencyjnie przezroczyste, a Settery są wolne od skutków ubocznych?
Czy rozwiązaniem byłoby przekazanie z powrotem kopii obiektu, na który wywołano setera, jako wartości zwracanej przez setera, a ta kopia zawiera zmianę wartości właściwości?
źródło
Odpowiedzi:
Dokładnie. Zobacz metodę klasy przypadków
copy
lub ogólną koncepcję soczewek.W szczególności, jeśli stan wymaga zmiany, użyłbyś monady stanu. Zmiany w tej monadzie stanu można wprowadzać za pomocą soczewek, co ułatwia wydobywanie informacji z „stanu” i zmianę ich.
Zobacz także to pytanie dotyczące ogólnego problemu wynikającego z głębokiej struktury, takiej jak „stan” i wprowadzania w nim zmian. Odpowiedzi mają dobre linki zarówno na soczewkach, jak i na suwakach, jeśli chcesz się w to zagłębić.
źródło
Cóż, w Haskell obiekty są (zwykle) niezmienne, więc gettery (które otrzymujesz, gdy używasz składni rekordu) lub funkcje, które działają jak gettery, są względnie przezroczyste. A potem nie „ustawiasz” wartości na obiektach - jeśli cokolwiek tworzysz nowy obiekt, który jest podobny do starego, ale z inną wartością dla jednego z pól. Jest to również czysta funkcja.
źródło
„Operatory pobierające i ustawiające mają obiekt jako parametr - mimo że zwykle jest to domniemane - więc funkcje pobierające są względnie przezroczyste. - delnan”
Referencyjnie przezroczysty oznacza, że funkcja ZAWSZE zwraca to samo wyjście dla tych samych danych wejściowych; więc jeśli atrybut obiektu został zmieniony przez narzędzie ustawiające, nie zwraca się tego samego wyniku. :)
źródło