由於顯而易見的原因,以下方法無效。如何在Clojure中編寫monoid協議?
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
具有零個參數,無參數的方法是不允許的(或沒有意義)的協議。在Haskell或Scala中,派發是基於類型而不是基於值的,這不是問題。
什麼是在Clojure中概念化和編寫Monoid
協議的正確方法?
由於顯而易見的原因,以下方法無效。如何在Clojure中編寫monoid協議?
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
具有零個參數,無參數的方法是不允許的(或沒有意義)的協議。在Haskell或Scala中,派發是基於類型而不是基於值的,這不是問題。
什麼是在Clojure中概念化和編寫Monoid
協議的正確方法?
看着source,這在new reducers library中實現的方式不是一個協議,而是一個重載函數。無參數調用是mzero;兩個參數調用是mappend。
更確切地說,monoid
有兩個參數 - op
和ctor
和返回功能,當不帶參數調用,評估ctor
,當有兩個,代表叫op
。
這與在摺疊中如何處理零一致,例如 - reduce
(摺疊)將評估摺疊的函數,如果有必要,將不帶參數地找到零。
我覺得有點羞愧,顯示出一些令人無法理解的東西,但我不知道如何在clojure中做得更好。感謝評論中的解釋/教育。
好的,那回答了這個問題。謝謝! – missingfaktor
爲什麼你需要它成爲協議而不是模塊?如果您期待不同的實現,那麼haskell將如何推斷特定用例需要哪種實現? (我認爲這是一個很好的問題,我只是試圖追究相關問題)。 –
@andrewcooke Haskell根據使用地點的靜態類型推斷。被調用的方法靜態解析。 –
@andrewcooke,模塊在你的陳述中的含義是什麼? – missingfaktor