根据定义或monoid,二元运算符必须是关联的,例如A op (B op C) == (A op B) op C
。
haskell中的base mconcat
definition是:
mconcat = foldr mappend mempty
因为我知道mconcat
函数的实现细节,所以在定义和使用函数不关联的假幺半群时会发生什么不好的事情吗?例如,为减法或除法定义实例。
这可能有用,还是我错过了这一点?
答案 0 :(得分:11)
在类型安全方面没有任何不妥之处:您的程序仍然不会崩溃。
但依赖于Monoid
实例的数据结构可能会产生意外或错误的结果。
考虑一个在插入时重新平衡的树,它提供了一种使用Monoid
实例组合其元素的方法。然后重新平衡,这应该是一个内部操作,对你来说是不可见的,参考透明度是“道德上破坏” - 相同的输入(最多被认为是隐藏的内部),但输出不同。