标准的Haskell类型预期将遵循哪些法则?

众所周知, Monad实例应该遵循Monad定律。 Functor实例应该遵循Functor定律,这也许并不为人所知。 尽管如此,我还是fmap id == id信心写一个优化fmap id == id的GHC重写规则。

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

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

最后,假设存在这样一个病例的病态如何存在边界,那么对于每种类型实例必须维护的法律来说,有一个标准的综合资源?


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

newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b

难道只是很难理解,或者编译器是否会在任何地方进行错误的优化?


哈斯克尔报告提出了以下法律:

  • Functor(例如fmap id == id
  • Monad(例如m >>= return == m
  • 积分(例如(x 'quot' y)*y + (x 'rem' y) == x
  • 数字( abs x * signum x == x
  • Show( showsPrec dxr ++ s == showsPrec dx (r ++ s)
  • Ix(例如inRange (l,u) i == elem i (range (l,u))
  • 这是我能找到的。 具体来说,关于公式(6.3.1)的部分没有提到任何法律,下一个关于Ord的部分也没有提到。


    我认为,我自己对法律“应该成为的”的看法并不是所有标准实例都支持的

  • Eq应该是等价关系。
  • Ord应该是一个总订单
  • Num应该是一个环,其中来自fromInteger的环同态,而abs / signum以明显的方式表现。
  • 许多代码将假定这些“法律”持有,即使他们没有。 这不是一个Haskell的具体问题,早期的C允许编译器根据代数法则对算术进行重新排序,并且大多数编译器可以选择重新实现这种优化,即使它们不被当前标准所允许并且可能会改变程序结果。


    它曾经是打破Ix法律可以让你做任何事情。 现在我认为他们已经解决了这个问题。 更多信息在这里:有谁知道(或记住)如何打破阶级法可能导致GHC的问题?

    链接地址: http://www.djcxy.com/p/43327.html

    上一篇: What laws are the standard Haskell type classes expected to uphold?

    下一篇: Relationship between Functor, Applicative Functor, and Monad