标准的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