Haskell - 实现Monoid如果运算符不是关联的,会发生什么

poi*_*ida 6 haskell monoids

根据定义或monoid,二元运算符必须是关联的,例如A op (B op C) == (A op B) op C.

haskell中的基本mconcat定义是:

mconcat = foldr mappend mempty
Run Code Online (Sandbox Code Playgroud)

既然我知道mconcat函数的实现细节,那么在定义和使用函数不关联的假幺半群时会发生什么不好的事吗?例如,定义减法或除法的实例.

这可能有用还是我错过了这一点?

Joa*_*ner 11

在类型安全方面没有任何不好的事情发生:你的程序仍然不会崩溃.

但依赖于您的Monoid实例的数据结构可能会产生意外或错误的结果.

考虑一个在插入时重新平衡的树,它提供了一种使用它们的Monoid实例组合其元素的方法.然后重新平衡,这应该是一个内部操作,对你来说是不可见的,参考透明度是"道德上破坏" - 相同的输入(直到所谓的隐藏的内部),但不同的输出.