我们在Haskell平台上获得的所有适用类型类的Haskell实例是否都被证明满足所有适用法律? 如果是,我们在哪里找到这些证据?
Control.Applicative的源代码似乎并未包含任何证据证明各种情况的适用法律确实存在。 它只是提到
-- | A functor with application.
--
--Instances should satisfy the following laws:
然后只是在评论中陈述法律。
我也发现了其他类型类(Alternative和Monad)实例的类似案例。
这些图书馆的用户是否应该自行验证这些法律?
但我想知道这些法律的严格证据是否已由开发商在其他地方提供过?
同样,我知道IO Monad的Applicate(或Monad)法律的严格证明,一般来说,涉及与外界交谈,可能非常复杂。
感谢。
答案 0 :(得分:11)
是的,举证责任完全在于图书馆作家。有一些违反这些法律的实施例子。违反法律的典型例子是ListT
,它不遵守大多数基础单子的monad法则(见examples)。这会产生非常错误的行为,并且没有人真正使用ListT
作为结果。
我很确定大多数这类样张都没有在标准的地方蚀刻。大多数证据都被社会各种好奇的成员简单地重复和检查,所以过了一段时间我们就知道哪些实施有和不满足他们的法律。
举一个具体的例子,当我写pipes
库时,我必须证明我的pipes
符合Category
定律,但我只是将这些证明保存在文本文件中如果有人提出要求,还可以用来记录未来的记录。将它们包括在源头中并不可行,因为它们可能会变得很长,尤其是对于相关性法则。
但是,我认为一个好的做法可能是在可能的情况下在原始存储库中包含机器检查的证据,以便用户可以根据需要参考它们。
答案 1 :(得分:1)
有一个优秀的库checkers,可以提供QuickCheck属性来检查法律。
答案 2 :(得分:1)
实验库ghc-proofs
允许您使用编译器为您验证此类法律:
app_law_2 a b (c :: Succs a) = pure (.) <*> a <*> b <*> c
=== a <*> (b <*> c)
它仅适用于少数情况,例如in my blog post描述的情况,最好将其视为实验,而不是现成的工具。