2012-05-26 88 views
9

由於顯而易見的原因,以下方法無效。如何在Clojure中編寫monoid協議?

(defprotocol Monoid 
    (mappend [a b]) 
    (mzero [])) 

mzero具有零個參數,無參數的方法是不允許的(或沒有意義)的協議。在Haskell或Scala中,派發是基於類型而不是基於值的,這不是問題。

什麼是在Clojure中概念化和編寫Monoid協議的正確方法?

+0

爲什麼你需要它成爲協議而不是模塊?如果您期待不同的實現,那麼haskell將如何推斷特定用例需要哪種實現? (我認爲這是一個很好的問題,我只是試圖追究相關問題)。 –

+1

@andrewcooke Haskell根據使用地點的靜態類型推斷。被調用的方法靜態解析。 –

+0

@andrewcooke,模塊在你的陳述中的含義是什麼? – missingfaktor

回答

5

看着source,這在new reducers library中實現的方式不是一個協議,而是一個重載函數。無參數調用是mzero;兩個參數調用是mappend。

更確切地說,monoid有兩個參數 - opctor和返回功能,當不帶參數調用,評估ctor,當有兩個,代表叫op

這與在摺疊中如何處理零一致,例如 - reduce(摺疊)將評估摺疊的函數,如果有必要,將不帶參數地找到零。

我覺得有點羞愧,顯示出一些令人無法理解的東西,但我不知道如何在clojure中做得更好。感謝評論中的解釋/教育。

+0

好的,那回答了這個問題。謝謝! – missingfaktor