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)
它只是难以理解或编译器在任何地方都不正确地优化?
在Haskell的报告中提到的法律为:
fmap id == id
)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)
)inRange (l,u) i == elem i (range (l,u))
)这就是我能找到的全部.具体来说,关于方程(6.3.1)的部分没有提到法律,下一个关于奥德也没有提到法律.