2014-09-05 8 views
6

Obecnie uczę się clojure dla zabawy i dziś wpadam na to article about reducers. Uważam, że jest to nie tylko interesujące, ale i trudne. Jako początkujący:Wyjaśnij bibliotekę `core.reducers` w laika pod pojęciem

  1. wiem jak używać rdzeń map, filter, reduce

  2. Rozumiem, że core/map, core/filter ... zwrócić sequable col

  3. Rich Hickey wspomniany core.reducers/map. .. return a reducible col

Ponieważ implementacja core/map ... i core.reducers/map ... wygląda bardzo identycznie. Moje pytanie to:

  1. W jaki sposób reducible col ma wpływ na okres laika?

  2. Czy ktoś może podać mi jakieś banalne przykłady funkcji reducible?

Dziękuję bardzo

Odpowiedz

2

Dla mnie główną ideą reduktorów jest to, że faktycznie mniej niż map/filter/reduce. Reduktorzy nie określają, czy wykonują leniwie, czy niecierpliwie, szeregowo lub równolegle, kolekcję lub inny typ struktury danych, a to, co produkują, może być kolekcją lub czymś innym. Przykłady:

  1. map/filter/reducemuszą być przekazywane do zbierania i musi wytwarzać zbiór; reduktor też nie musi tego robić. Ta idea reduktorów jest rozszerzona w transducers tak, że ten sam przetwornik może być zastosowany do kolekcji lub kanału core.async.

  2. Reduktory również nie określają, w jaki sposób są wykonywane ,. map/filter/reduce zawsze wykonywać seryjnie w kolekcji ; nigdy równolegle. Jeśli chcesz wykonywać równolegle kolekcję , musisz użyć innej funkcji: pmap. Możesz wyobrazić sobie, że jeśli chcesz filtrować równolegle, możesz również utworzyć funkcję pfilter (to nie istnieje, ale możesz go napisać). Zamiast tworzyć równoległą wersję każdej funkcji, reduktory po prostu mówią: "Nie obchodzi mnie, jak jestem wykonywany" i to jest do innej funkcji (fold w przypadku reduktorów), aby zdecydować, czy wykonanie powinno zostać wykonane równolegle lub nie. fold jest bardziej ogólny niż pmap, ponieważ reduktory, do których ma zastosowanie, mogą filtrować lub mapować (lub skomponować je do obu).

W ogóle, ponieważ reduktory uczynić mniej założeń dotyczących co stosowane do, co wytwarzają lub jak są one stosowane, są bardziej elastyczne i dlatego może być stosowany w szerszej gamy sytuacje. Jest to przydatne, ponieważ reduktory skupiają się na "tym, co robi twój program", a nie "jak to robi". Oznacza to, że twój kod może ewoluować (np. Z jednego wątku do wielu wątków lub nawet do aplikacji rozproszonej) bez konieczności dotykania części programu, która stanowi rdzeń logiki tego, co robi twój kod.

+0

tks @optevo, to wspaniałe podsumowanie, ale twój nie odpowiedział, jak działa 'reducible'function w' core.reducers' i czy możesz to zrobić? – babygau

Powiązane problemy