众所周知,Monad
实例应该遵循单子定律。Functor
实例应该遵循函子定律可能不太为人所知。尽管如此,我对编写优化fmap id == id
.
还有哪些其他标准类有隐含的法律?(==)
必须是真正的等价关系吗?Ord
一定要形成偏序吗?总订单?我们至少可以假设它是传递的吗?反对称?
最后几个似乎没有在 Haskell 2010 报告中指定,我也没有信心利用它们编写重写规则。但是,是否有任何通用库可以做到?一个人可以自信地写出一个多么病态的例子?
最后,假设这样一个实例的病态程度是有界限的,每个类型类实例必须遵守的法律是否有一个标准的、全面的资源?
例如,我要定义多少麻烦
newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b
仅仅是难以理解还是编译器会在任何地方错误地优化?