2014-09-05 53 views
6

我目前在學習clojure的樂趣,今天我遇到了這個article about reducers。我發現它不僅對我有趣而且棘手。作爲一個初學者:解釋`core.reducers`圖書館的外行人

  1. 我知道如何使用核心mapfilterreduce

  2. 我明白core/mapcore/filter ...返回sequable山坳

  3. 豐富希基提到core.reducers/map。 .. return a reducible col

因爲執行core/map ...和core.reducers/map ...看起來非常相似。我的問題是

  1. reducible col在通俗的術語中有什麼不同?

  2. 任何人都可以給我一些簡單的例子reducible函數?

謝謝你這麼多

回答

2

對於我來說,減速的主要思想是,他們實際上做map/filter/reduce。 Reducers不指定它們是以串行方式還是並行方式,在集合上或其他類型的數據結構上進行懶惰或熱切地執行,並且它們產生的內容可能是集合或其他內容。實例:

  1. map/filter/reduce必須傳遞的集合,並且必須產生 集合;減速機也不必做。減速器的這種想法是在transducers中延伸的 ,使得相同的換能器可應用於集合或core.async通道。

  2. 減速機也沒有指定它們如何被執行map/filter/reduce始終以連續方式跨 集合執行;從不平行。如果要並行執行 集合,則必須使用不同的函數:pmap。你可以想象,如果你想並行過濾,你可以創建一個函數pfilter(這不存在,但你可以寫它)。 而不是創建每個函數的並行版本,reducer簡單地說 「我不在乎我如何執行」,並且它取決於另一個函數(在reducer的情況下爲fold )來決定是否應該完成執行平行或不平行。 foldpmap更一般,因爲它適用的約簡器可以 做過濾或映射(或組合做兩者)。

在一般情況下,由於減速做出少的假設它們適用於什麼,他們產生它們的應用,他們更靈活,因此可以在更廣泛的被使用的情況。這是非常有用的,因爲減員會關注「你的程序的功能」,而不是「它是如何做的」。這意味着您的代碼可以發展(例如從單個線程到多線程,甚至到分佈式應用程序),而不必觸摸構成您的代碼的核心邏輯的程序部分。

+0

tks @optevo,這是很好的總結,但你的回答並沒有回答'core.reducers'中'reducible'的工作方式,你能舉個例子嗎? – babygau 2014-09-05 11:32:15