7

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

haskell 中的基本mconcat定义是:

mconcat = foldr mappend mempty

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

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

4

1 回答 1

12

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

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

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

于 2014-11-22T10:32:08.040 回答