2014-11-22 36 views
5

根據定義或一個二元組,二元運算符必須是關聯的,例如, A op (B op C) == (A op B) op CHaskell - 實現Monoid如果運算符沒有關聯會發生什麼

base mconcat definition在Haskell是:

mconcat = foldr mappend mempty 

因爲我知道mconcat功能的實現細節,就什麼不好,從定義和使用僞造的類羣,其中功能不關聯發生的呢?例如定義減法或除法的實例。

這可能有用,或者我錯過了這一點?

回答

11

在類型安全方面沒有什麼不好:您的程序仍然不會崩潰。

但依賴於您的Monoid實例的數據結構可能會導致意外或錯誤的結果。

考慮插入時重新平衡的樹,並提供了一種使用它們的實例組合其元素的方法。然後,重新平衡,這應該是一個內部操作,對你而言是不可見的,而參考透明度是「道德上破裂」的 - 同樣的輸入(可能是隱藏的內部),但輸出不同。

+1

我認爲這比崩潰更糟糕。但是我想如果有人希望堅持「a-(b-c)==(a-b)-c」應該成立,那麼就沒有辦法... – 2014-11-22 16:45:35

相關問題