Na cs.stackexchange zapytałem o bibliotekę algebird scala na githubie, spekulując, dlaczego mogą potrzebować abstrakcyjnego pakietu algebry.
Strona github zawiera kilka wskazówek:
Implementacje Monoidów dla interesujących algorytmów aproksymacyjnych, takich jak filtr Bloom, HyperLogLog i CountMinSketch. Pozwalają ci myśleć o tych wyrafinowanych operacjach, takich jak liczby, i dodawać je w hadoopie lub Internecie, aby tworzyć potężne statystyki i analizy.
oraz w innej części strony GitHub:
Został pierwotnie opracowany jako część API Matrix Scaldinga, gdzie Matryce miały wartości, które są elementami Monoidów, Grup lub Pierścieni. Następnie stało się jasne, że kod ma szersze zastosowanie w Scaldingu i innych projektach na Twitterze.
Nawet Oskar Boykin z Twittera zagrał:
Główną odpowiedzią jest to, że wykorzystując strukturę półgrupową, możemy budować systemy, które poprawnie działają równolegle, nie znając operacji leżącej u podstaw (użytkownik obiecuje skojarzenie).
Używając Monoidów, możemy skorzystać z rzadkości (mamy do czynienia z wieloma rzadkimi macierzami, w których prawie wszystkie wartości są zerowe w niektórych Monoidach).
Korzystając z pierścieni, możemy dokonywać mnożenia macierzy na rzeczach innych niż liczby (co czasami zrobiliśmy).
Sam projekt algebird (a także historia problemów) dość jasno wyjaśnia, co się tutaj dzieje: budujemy wiele algorytmów do agregacji dużych zestawów danych, a wykorzystanie struktury operacji daje nam zwycięstwo po stronie systemowej (co zwykle stanowi problem przy próbie produkcji algorytmów na tysiącach węzłów).
Rozwiąż problemy systemowe jeden raz dla dowolnej półgrupy / monoida / grupy / pierścienia, a następnie możesz podłączyć dowolny algorytm bez konieczności myślenia o Memcache, Hadoop, Storm itp.
Jakie są Bloom filters
/ hyperloglog
/ countminsketch
jak liczby?
Jak to się dzieje, że agregacje baz danych mają strukturę monoidalną?
Jak wygląda ta monoida? Czy kiedykolwiek mają strukturę grupową?
Przydałyby się odniesienia do literatury.