众所周知,Monad
实例应遵循Monad法则。 Functor
实例应遵循Functor法则也许不太为人所知。尽管如此,我对编写优化fmap id == id
的GHC重写规则充满信心。
还有哪些其他标准类别具有隐式法律? (==)
是否必须是真正的等价关系? Ord
是否必须形成部分顺序?总订单?我们至少可以假设它是可传递的吗?反对称?
在Haskell 2010的报告中似乎没有指定这些最后几个,我也不会对使用这些规则编写重写规则感到自信。但是,有没有常用的库?一个实例可以自信地写出怎样的病态?
最后,假设存在这样一个实例的病理状态是否存在界限,是否存在每个类型类实例必须遵守的法律的标准,全面的资源?
例如,我要定义多少麻烦
newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b
仅仅是难以理解,还是编译器会在任何地方进行错误的优化?
最佳答案
Haskell report提及以下方面的法律:
fmap id == id
)m >>= return == m
)(x ‘quot‘ y)*y + (x ‘rem‘ y) == x
)abs x * signum x == x
)showsPrec d x r ++ s == showsPrec d x (r ++ s)
)inRange (l,u) i == elem i (range (l,u))
)这就是我所能找到的。具体来说,关于等式(6.3.1)的部分没有提及任何定律,而下一个关于Ord的法律也没有提及。