Programowanie funkcyjne: stan vs. przeniesieniu

głosy
13

Potrzebuję pomocy uzyskiwanie moja głowa wokół różnicy między moim obecnym OOP pojęcia państwa, a sposób będzie się to odbywać w języku funkcjonalnym podobny Haskell lub Clojure.

Aby korzystać z utartych przykład, powiedzmy, że mamy do czynienia z rachunków bankowych obiektów uproszczona / elemencie / cokolwiek. W języku OOP, muszę jakąś klasę gospodarstwa odniesienie do BankAccount, co miałoby zmiennych instancji dla rzeczy takich jak stopy procentowej, i podobne metody setInterestRate (), które zmieniają stan obiektu i generalnie nic nie wróci. W powiedzieć Clojure, musiałbym struct bank-konto (uwielbiony HashMap) oraz specjalne funkcje, które mają parametr bank-konta i innych informacji i powrót nowego struct. Więc zamiast zmiany stanu pierwotnego obiektu, teraz mam nowy jeden zwracane z pożądanych modyfikacji.

Więc ... co mam z nim zrobić? Nadpisać cokolwiek zmienna została przedstawieniu stary bank-konto? Jeśli tak, to ma przewagę nad podejściem OOP państwowego zmienia? W końcu, w obu przypadkach wydaje się jeden ma zmienną, która odwołuje się do obiektu z niezbędnymi zmianami. Opóźniony jak ja, mam tylko mgliste pojęcie o tym, co się dzieje.

Mam nadzieję, że sens, dzięki za wszelką pomoc!

Utwórz 09/12/2008 o 20:24
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
4

Więc ... co mam z nim zrobić? Nadpisać cokolwiek zmienna została przedstawieniu stary bank-konto?

tak

Jeśli tak, to ma przewagę nad podejściem OOP państwowego zmienia?

Powiedzmy obliczanie Cokolwiek robisz na tej struktury zajmuje dużo czasu i coś się w połowie drogi i trzeba powrócić do oryginału struct lub obliczenie podniesiony błąd. Z interpretacją pan przedstawił mi OO (za pomocą odniesienia, ponieważ można mieć niezmienną język OO), że dane mogą być nieznane skorumpowanych --it, chyba wystarczy informacja została podana z nieudanego wywołania funkcji i pozwala sugerować, że nie powiodła się źle. W podejściu funkcjonalnym wiesz na pewno, że oryginalna struktura danych jest poprawna --because początkowo wykonane kopie.

Przedłużyć ten scenariusz w aplikacjach wielowątkowych. Możemy zapewnić, że nikt inny nie korzysta strukturę danych jesteśmy ponieważ wszyscy mamy naszą własną wersję.

Dodatkowo, możemy zaoszczędzić miejsce przy użyciu danych z innej struktury, które są kopiowane z. Klasycznym przykładem jest podczas dodawania elementu do czele listy. Jeśli mamy wskaźnik do drugiego elementu, a wskaźnik do pierwszego elementu możemy odniesienie zarówno list tylko wielkością pierwszy (patrz niżej). Bez niezmienności nie możemy tego zagwarantować.

        b__
           |  
a -> [6|] -+-> [5|] -> [4|] -> [3|] -> [2|] -> [1|x]
Odpowiedział 09/12/2008 o 20:58
źródło użytkownik

głosy
11

W czystym stylu funkcjonalnym, nigdy nie nadpisać dowolną zmienną.

Analogia byłoby czasoprzestrzeni w fizyce. Jeśli wziąć pod uwagę świat jako 3d, następnie obiekty nie zostały ustalone pozycje - poruszają się w czasie. Przynieść matematyki, wywieranego na świat fizyczny, dlatego też dodać wymiar czasu i rozważyć wartości różnych właściwości w określonym czasie. W ten sposób zrobiliśmy obiekty naszej pracy na stałe. Podobnie w programowaniu, jest prostota koncepcyjne, które można uzyskać poprzez pracę z wartościami niezmiennymi. Obiekty o tożsamości w świecie rzeczywistym można modelować jako ciąg wartości niezmiennych (stanów obiektu czasami wzrasta), a nie jako pojedyncza wartość, która zmienia.

Oczywiście szczegóły jak skojarzyć sekwencji wartości do „tożsamości obiektu” może być trochę owłosione. Haskell ma monady , które pozwalają modelu państwa. Programowanie bierna funkcjonalna jest bardziej dosłowna próba modelowania obiektów na świecie z czystym aktualizacjach funkcjonalnych, że myślę, że jest to bardzo obiecujący kierunek programowania.

Będę pamiętać, że Clojure, w przeciwieństwie do Haskell, nie jest czysta i można zaktualizować zmienne, jak sugeruje. Jeśli aktualizujesz tylko kilka zmiennych na wysokim poziomie, to będzie prawdopodobnie nadal korzystać z wielu koncepcyjnych korzyści prostotą programowania funkcjonalnego.

Odpowiedział 09/12/2008 o 21:10
źródło użytkownik

głosy
1

Spójrz na Haskell, który jest czysty funkcjonalny języka nie ma ponowny przydział w ogóle, jak również żadnych innych skutków ubocznych: w tym celu IO w IO monada skonstruowania faktycznie zastępuje RealWorld nową instancję Świat, który ma, na przykład nowy tekst wyświetlany w konsoli.

Odpowiedział 09/12/2008 o 22:29
źródło użytkownik

głosy
8

Przypuszczalnie w świecie OO masz pętlę i modyfikacji tych rachunków bankowych w kółko w odpowiedzi na wnioski. Załóżmy, że masz całą gamę rachunków i mają one typu portfelowych. Następnie w Haskell byłoby napisać funkcję czystego

updatePortfolio :: Request -> Portfolio -> Portfolio

A głównym pętla może żądania odczytu ze standardowego wejścia i zachować swój portfel na bieżąco. (Przykład nie jest dużo używać, chyba że można napisać portfela, jak również, ale jest prostsza).

readRequest :: IO Request  -- an action that, when performed, reads a Request with side effects

main :: Portfolio -> IO ()  -- a completely useless program that updates a Portfolio in response to a stream of Requests

main portfolio = do req <- readRequest
                    main (updatePortfolio req)

i teraz mam nadzieję, że widzisz, co się stało w stanie zmienny: w typowym programie funkcjonalnym, który zmienia stan jest przekazywany jako parametr do funkcji. Gdy changess stan, należy nawiązać nowe połączenie funkcji. Wezwanie jest w pozycji ogonowej (można patrzeć w górę „właściwego połączenia ogon”), a więc nie stosować żadnych dodatkowych środków, aw rzeczywistości, gdy kompilator generuje kod montaż generuje pętli i będzie utrzymywać wskaźnik do stale zmieniających portfelem w rejestrze.

Jest to bardzo przykładem zabawka, ale mam nadzieję, że to daje trochę smaku języka funkcjonalnego.

Odpowiedział 10/12/2008 o 04:57
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more