..


Linki sponsorowane

Programowanie funkcyjne w Ruby

Artykuł napisany przez Alessio Saltarini
Strona 1 z 2

Wprowadzenie

Programowanie funkcyjne (FP) to alternatywny paradygmat programowania w tradycyjnym (lub strukturalnych konieczne programowania i programowania obiektowego) wymyślił, jak "rachunek lambda" przez Alonso Kościół w ciągu 30 lat, na długo przed wiadomo było, że dokładnie to, co komputer.

Badania kościoła posłużyły jako podstawa dla rozwoju języka programowania Lisp, a następnie były one prawie całkowicie opuszczony, ponieważ potwierdził konieczność oprogramowanie komputerowe, które wygenerowało Basic i jak Pascal, C, a dziś nowoczesnego C + + i Java.

Podstawowym założeniem rachunku lambda jest to, że program komputerowy może być wyrażona, a nie obowiązkowy zestaw instrukcji (zrób to, zrób to, a następnie zrobić), z szeregiem funkcji, których parametry są tyle funkcji.

Program funkcjonalny zwykle składa się z funkcji, która przyjmuje jako wejście innej funkcji, które ma inną funkcję jako dane wejściowe, i tak dalej.

Oznacza to, że podczas gdy tradycyjny program, napisany w imperatyw paradygmatu lub obiektów, składa się z serii poleceń, które działają na zmienną, której wartość stanowi "państwo" z programu, programowanie funkcjonalne pojęcie zmienna nie istnieje (Nie ma pojęcia "państwo") i wykonanie powierzono szereg funkcji, które działają na stałe funkcji.

Zainteresowanie w językach funkcjonalnych został utracony w czasie kilku powodów, przede wszystkim trudności w nauce (zwykle człowiek myśli obiektów zamiast funkcji, chyba że jest matematykiem!) I trudności w znalezieniu wydajne kompilatory lub tłumaczy.

Ruby i FP

Dzisiaj, to zainteresowanie budziła jednak, ponieważ programowanie funkcjonalne, niesie ze sobą konsekwencji bardzo cenne: nie może z definicji wynik w run-time błędów. Innymi słowy, w czasie kompilacji lub po raz pierwszy albo działa lub nie działa. Nie można zachowywać się w sposób nie przewidywalny w góry (w funkcjonalny program, w rzeczywistości nie ma pojęcia wyjątku).

W ten sposób urodziło się, a niektóre są kwitnącej językach funkcjonalnych (mniej lub bardziej czyste, i mniej lub bardziej poparcie dla tradycyjnego programowania), takie jak: ML / OCaml , Haskell , F # .

Ruby nie jest funkcjonalny język, ale korzysta z niektórych funkcjonalności techniki programowania, które pomogą nam dokonać algorytmy bardziej syntetyczne, silniejsze i bardziej skuteczne. Poza tym, generalnie, łatwiejsze do odczytania.

Każdy i map

Pierwszą cechą charakterystyczną języków wspierających w jakiś sposób FP jest mieć w swojej bibliotece standardowej funkcjonalnych iteratory. Na przykład:






 Elementy $ = [1,2,3,4,5]







 $ Elementi.map {| elem | stawia elem + 1}



Funkcja "Mapa" i "każdy" Ruby nie są niczym więcej, niż stosowane FP! W rzeczywistości istnieją funkcje, które mają inne funkcje jako argumenty. W Ruby, a następnie, że te części bloków kodu zawarte w nawiasach {} lub między nie / koniec funkcji anonimowych zbudowane specjalnie do osób z wielu funkcji.

Są one wywoływane w FP aby funkcje, czyli funkcje, które mają wiele funkcji, jak wejście.

W szczególności "mapa" działa jak funkcja klasycznej i matematycznych można odczytać w następujący sposób: dla każdego elementu serii z 04:59, uruchomić funkcję: Drukuje następnej liczby naturalnej.

, Że "mapa" i "współpracowników", dla każdego elementu kolekcji (tablicy w Ruby powie) pewnej funkcji zdefiniowanych w bloku.

To samo stałoby się naturalnie z:

 



 $ Elementi.each {...}

 
Zamknięcia: Proc i lambda

Zamknięcia są koncepcji podobnej do tej funkcji wyższego rzędu: zdolność do znacznie zdefiniować funkcję do działania w zmiennych, które żyją w kontekście różni się od funkcji (takich jak zmienne globalne lub funkcji innych zmiennych).

W Ruby, można napisać zamknięcia za pomocą funkcji anonimowych, które można zdefiniować z kluczowych Proc.new lub lambda.

Oto przykład:






 końcowego mnożenia (mnożnik)



    



 powrót lambda {| n | n mnożnik *}







 koniec









 PER3 mnożenia = (3)









 per3.call stawia (3) # => 9







 stawia per3.call (per8.call (2)) # => 48



W tym przykładzie, nie tylko funkcję nazywam oczywiste "mnożenia". Co w tym dziwnego tej funkcji? Tutaj po prostu nie używać żadnych zmiennych!

Argument ten nie jest zmienną mnożnik jest po prostu symbol zastępczy stałą lub funkcję.

Ale w tradycyjnego programowania, chcę napisać:






 pomnożyć def (a, b)



    



 powrót a * b







 koniec









 stawia mnożenia (3.3)



Jak widać jednak, za pomocą zamknięcia nazywam "operator" Wzywam PER3, który określa zachowanie wszystkich mnożenia "x3". Wtedy nazywają to operator numer 3. Mogę nawet nazwać to rekurencyjnie! Albo go nazwać, zamiast stałej, na innej funkcji.

W tradycyjnej programowania, jednak jestem zmuszony do określenia a priori liczby zmiennych zaangażowanych w transakcję - ograniczając w ten sposób mnożenie dwóch liczb - i, co najważniejsze, muszę wstawić koncepcji państwa, przydzielania pamięci dla dwóch zmiennych, które zawierają wartości należy pomnożyć.

W tej samej kategorii ...
E-Learning
Ruby i Ruby On Rails (Kurs) Ruby i Ruby On Rails (Kurs)
Tworzenie oprogramowania i aplikacji webowych w języku Ruby RoR. Począwszy od 39 €.
Linki sponsorowane