标准的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
难道只是很难理解,或者编译器是否会在任何地方进行错误的优化?
哈斯克尔报告提出了以下法律:
fmap id == id ) m >>= return == m ) (x 'quot' y)*y + (x 'rem' y) == x ) abs x * signum x == x ) showsPrec dxr ++ s == showsPrec dx (r ++ s) ) 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
