Biorąc pod uwagę, że Ruby ma wbudowane dobre funkcje operacji na liście - redukuj, mapuj, zaznaczaj, zbieraj itp. Ma Procs, Blocks i Lambdas i ma ładne wsparcie iteracji ( each
rodzina), czy byłbym złą decyzją projektową, jeśli spróbuję napisać wszystkie moje ruby w jak najbardziej funkcjonalny sposób? Czy jest to szczególnie przydatne w przypadku kodu, który ma niewielką liczbę operacji wejścia / wyjścia (lub mniej takich efektów ubocznych)?
Uczyłem się Haskell (zwanego „prawdziwym” językiem hakera) i jestem zakochany w tym, jak to robić - uwielbiam Ruby, ale myślę, że może być jeszcze fajniej, gdy napłynie do niego więcej ducha Haskell (cóż, nie Ruby przede wszystkim pożycza / uczy się dużo?)
Konstruktywne wskazówki są mile widziane ...
ruby
haskell
functional-programming
nemesisfixx
źródło
źródło
Odpowiedzi:
Robiłem to z Pythonem. Uważam, że nieporęczne jest pisanie w dziedzicznie czystym stylu funkcjonalnym w języku, który nie został do tego zaprojektowany. Na przykład, kontrast dwóch definicji in_order :
Pisanie
in_order
Haskella w pythonie będzie zarówno pełne (ponieważ pyton nie obsługuje bardzo dobrze niezbędnych idiomów), jak i wolne (przestrzeń liniowa zamiast stałej przestrzeni Haskella z powodu lenistwa).Miałem jednak sukces w tworzeniu programów w języku Python z funkcjonalną organizacją i idiomatyczną implementacją każdej funkcji. Pomysł, że jest to dobry sposób na programowanie, jest w rzeczywistości tezą stojącą za moim projektem katalogu kodów . Więc moje komponenty są zorientowane na abstrakcje i działające na nich funkcje (z czystym interfejsem ), a nie na klasy ze stanem, i ładnie się ze sobą łączy. W rzeczywistości kod zorganizowany w ten sposób wydaje się być bardziej elastyczny do ponownego wykorzystania niż kod zorganizowany z klasami. Może to być jednak osobiste nastawienie, ponieważ wciąż jestem wielbicielem Haskell.
Powiedziałbym więc, że odpowiedź na twoje pytanie jest dość . Użyj swoich funkcjonalnych korzeni, aby pomóc ci myśleć, ale nie przesadzaj. Na przykład. symulowanie leniwych list w Rubim dla samego idiomu będzie prawdopodobnie bardziej kłopotliwe niż warte.
źródło
and
ich zużyciu; będzie się zachowywał jak pętla. Podczas gdy lista porównań Pythona będzie musiała zostać wygenerowana w całości, zanim analogand
wyświetli jakiekolwiek z nich (chyba że użyjesz generatorów ... co, jak przypuszczam, jest możliwe).Możesz pisać kod Ruby w funkcjonalnym stylu, jakby to był Schemat, a nie Haskell. Aby napisać to tak, jakby to był Haskell, potrzebowałby systemu typu Haskell oraz wszechstronnej, leniwej oceny.
źródło
Odkryłem, że zrozumienie programowania funkcjonalnego, a zwłaszcza Haskella, jest dla mnie pomocne w pewnych sytuacjach, które spotkałem w Ruby. Ale im więcej się uczę Haskella, tym bardziej zdaję sobie sprawę, jak daleko Ruby jest w stanie być podobnym do Haskella.
Po pierwsze ładowanie modułu / kodu jest fatalne. Bieżący interpreter nie ma włączonej optymalizacji wywołania ogona, więc nie można używać rekurencji tak jak w Haskell. A kiedy wejdziesz w Monady, naprawdę nie ma porównania poziomów abstrakcji, które możesz osiągnąć w Haskell vs. Ruby.
Jeśli jesteś zainteresowany, w trakcie nauki zamieszczałem kod porównawczy Ruby / Haskell na gist.github.com .
Najlepszą techniką, którą nauczyłem Ruby, jest znajdowanie czystych funkcji tam, gdzie mogę, i to brzmi, jakbyś próbował.
źródło
self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g])
. Nie ma żadnego powodu, dla którego nie można świadomie korzystać z monad, w przeciwieństwie do korzystania z nich, nawet nie wiedząc, że ich używasz (jak listy).Powiedziałbym tak". To, o czym mówię, to funkcjonalny wpływ programowania w języku ruby. Funkcjonalny paradygmat ma kilka naprawdę fajnych koncepcji, które uzupełniają się lub pokrywają z obiektowym (w szczególności brak efektów ubocznych).
Wspaniałą rzeczą w Ruby jest to, że umożliwia on kodowanie w stylu liniowym, zorientowanym obiektowo lub funkcjonalnie, lub w kilku kombinacjach. A twój prosty, liniowy skrypt może przekształcić się w styl OO / funkcjonalny, jeśli i kiedy jego złożoność wzrośnie.
źródło
To zależy od tego, czy będziesz współpracować z innymi. Jeśli pracujesz nad kodem sam, użyj stylu, który najbardziej ci odpowiada. Jednakże, jeśli pracujesz z innymi programistami Ruby, mogą nie być przyzwyczajeni do czysto funkcjonalnego stylu programowania i dlatego mogą być mylone przez twój kod. Z drugiej strony, jeśli twoi współpracownicy są również programistami Haskell, którzy przeprowadzili migrację do Ruby, możesz nie mieć tego problemu.
źródło