2014-02-05 31 views
1

E. g。爲什麼reduce不能用於多輸入序列作爲它的參數,如mapmapv執行:爲什麼「減少」不是可變的

這個決定背後的實現者/ Rich Hickeys原因是什麼?

會影響性能嗎?如果是的話如何?爲什麼只是語言設計想要引導我們走向「正確」的方向呢?

編輯:由於在討論發現(與@Alex的幫助下),這裏有一個可變參數reduce

([f coll])

([f val & colls])(重載,因爲初始累積將在一個可變需要場景)。

因此,即使今天它是可變的,沒有任何關於它當前的行爲會改變。

+0

假設有這樣的「減少」變體。你會期待什麼論據,你通過它的功能? – Alex

+0

累加器和'n'多個參數表示輸入序列的第一個元素,如'map'確實如此.. –

+0

如果沒有提供,集合的第一個元素將作爲「reduce」的累加器的初始值,這不適用於可變情況。這並不是說你不容易編寫自己的需要初始值的版本,它只是不會有完全相同的語義。 – Alex

回答

2

這已經是可變參數(在支持一個以上的元數的意義上):

=> (doc reduce) 
------------------------- 
clojure.core/reduce 
([f coll] [f val coll]) 
    f should be a function of 2 arguments. If val is not supplied, 
    returns the result of applying f to the first 2 items in coll, then 
    applying f to that result and the 3rd item, etc. If coll contains no 
    items, f must accept no arguments as well, and reduce returns the 
    result of calling f with no arguments. If coll has only 1 item, it 
    is returned and f is not called. If val is supplied, returns the 
    result of applying f to val and the first item in coll, then 
    applying f to that result and the 2nd item, etc. If coll contains no 
    items, returns val and f is not called. 

如果你成功了可變參數進一步(例如,允許集合的任意數字),則3參數的情況下將含糊 - 你的意思是通過一個初始值,或兩個不同的集合?

恕我直言,在多個不同方面製作功能variadic是一種反模式。僅僅因爲你可以用arity重載來改變函數的含義並不意味着它是一個好主意:你通常通過組成更高階的函數明確地達到相同的效果更好。

+1

Afaic * variadic *意味着無限期的參數,而不是不同的arities的重載。至少我是這個意思。我知道'reduce'並不是以支持它的方式實現的。這就是我問及設計決定的原因。 –

+0

@lgrapenthin,你可以使用'map'來達到同樣的效果'(reduce f acc(map vector coll1 coll2 coll3))''。請注意'filter'不支持多個集合。 – ponzao

+0

是的,我知道這是可能的'地圖'。但'map'是懶惰的,因此會產生不必要的每步開銷,對於reducers矢量也是需要的輸入。我不認爲'過濾器'的可變輸入是多麼有意義。 –

相關問題