众所周知,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)
  • Monad(例如m >>= return == m)
  • 整数(例如(x ‘quot‘ y)*y + (x ‘rem‘ y) == x)
  • Num(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)的部分没有提及任何定律,而下一个关于Ord的法律也没有提及。

    10-02 00:29