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:
map
/filter
/reduce
muszą 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
.
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.
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