2014-11-22 41 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

相关问题