标准的Haskell类型类有哪些法则可以维护?

J. *_*son 9 haskell interface proof

众所周知,Monad实例应该遵循Monad法则.可能不太为人所知,Functor实例应遵循Functor法则.尽管如此,我仍然对编写优化的GHC重写规则感到相当自信fmap id == id.

还有哪些标准类有隐含法则?是否(==)有一个真正的等价关系?是否Ord必须形成部分订单?总订单?我们至少可以假设它是可传递的吗?反对称?

这些最后几个似乎没有在Haskell 2010报告中指定,也不会有信心编写利用它们的重写规则.但是,有没有共同的图书馆?一个实例的病理如何可以自信地写出来?

最后,假设这样一个实例可能存在一个边界,那么每种类型实例必须遵守的法律是否有一个标准的综合资源?


举个例子,我要定义多少麻烦

newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b
Run Code Online (Sandbox Code Playgroud)

它只是难以理解或编译器在任何地方都不正确地优化?

Dav*_*vid 5

Haskell的报告中提到的法律为:

  • Functor(例如fmap id == id)
  • Monad(例如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))
  • Ix(例如inRange (l,u) i == elem i (range (l,u)))

这就是我能找到的全部.具体来说,关于方程(6.3.1)的部分没有提到法律,下一个关于奥德也没有提到法律.