Programowania funkcyjnego z Pythonem spotkania

Jacek Laskowski opublikował wczoraj na swoim blogu ciekawą notkę Programowania funkcyjnego z Clojure początki niełatwe (szczególnie mentalnie). Myśli o programowaniu funkcyjnym siedzą mi w głowie od ponad roku, więc przeczytałem ją z zainteresowaniem. Na końcu zamieścił małe wyzwanie: by przepisać podanego przez niego jednolinijkowca do Javy.

(doseq [linia (map (fn [[h s]] (str h " (" s ")")) (partition 2 [1 2 3 4 5 6 7 8 9 0]))] (println linia))

Java to nie jest mój ulubiony język, więc postanowiłem sprawdzić jak by dało się to zrobić w Pythonie (który posiada lekkie wsparcie tego paradygmatu funkcyjnego).

Do dzieła

Na początek mały problem – Python nie posiada wbudowanej funkcji partition. Trzeba ją samemu napisać. Na przykład tak:

def partition(size, seq):
    result = []
    for i in seq:
        result.append(i)
        if len(result) == size:
            yield tuple(result)
            result = []

Uwaga: to jest odpowiednik clojure.core/partition(n coll). Nie obsługuje ani step ani pad.

Potem już idzie z górki:

print "\n".join(map(lambda t: "%i (%i)" % t, partition(2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 0])))

Można to napisać nawet bardziej w stylu Pythona (poprzez zastąpienie funkcji map i lambda przez listę składaną):

print "\n".join(["%i (%i)" % t for t in partition(2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 0])])

Programowanie funkcyjne?

Kod, który w Clojure zajmował 106 znaków dało się skrócić do odpowiednio 92 i 87 znaków.

Co więcej udało się z niego usunąć efekty uboczne i sekwencyjność wprowadzoną przez doseq. Cały napis jest budowany w pamięci a dopiero następnie wyświetlany – co jest bardziej funkcyjne.

W Clojure dało by się to zrobić za pomocą kodu:

(println (apply str (interpose "\n" (map (fn [[h s]] (str h " (" s ")")) (partition 2 [1 2 3 4 5 6 7 8 9 0])))))

Przy okazji: to jest prawdopodobnie pierwsza linijka mojego kodu w tym języku więc mogła by być lepsza.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s

%d blogerów lubi to: