应该传递给以下代码的CoArbitrary的ex是什么?
如何在Test.QuickCheck.Function中使用函数来表示命题中的f和g?
编写是否正确,如果不是,怎么写?
其中types = [f,g] :: [Function]
变体可以接受功能吗?因为我知道生成函数经常使用><或QuickCheck源代码中所述的变体
错误:
<interactive>:1:12:
No instance for (Eq (b0 -> b0))
arising from a use of `prop_commutative'
Possible fix: add an instance declaration for (Eq (b0 -> b0))
In the first argument of `quickCheck', namely `prop_commutative'
In the expression: quickCheck prop_commutative
In an equation for `it': it = quickCheck prop_commutative
[更新]
另一篇文章模仿Function中的示例,在'='处解析错误
在ghci let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f)
可以运行
代码:
import Test.QuickCheck.Function
import Test.QuickCheck.Gen
import Test.QuickCheck
let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f)
main = quickCheck prop_commutative
答案 0 :(得分:3)
QuickCheck查找反例。因此,您需要对所寻求的财产进行否定:
prop1 f g x = not $ (f . g) x == (g . f) x
此特定属性未指定函数类型 - a -> a
的任何函数都可以工作。因此,您需要为f
和g
或整个函数prop1
指定类型。
您无法比较f . g
和g . f
的相等性,因为它们都是函数,而且对于Haskell中具有无限域的函数,您不能对Eq
有明智的定义。您还需要随机生成参数,并通过比较结果来比较f . g
和g . f
函数
通过将随机参数传递给两者。
阅读Fun _ f
类型的documentation。 f
有一个单态函数。 QuickCheck无法生成不同类型的随机函数 - 它只能生成某种特定类型的函数。但.
是多态,因此无法从上下文推断出特定类型的f。因此,您需要为f
和g
选择一些任意类型,并在属性的类型签名中指定它。
此外,顶级定义不需要let
。我们只能在let..in
和do
块内部的表达式中使用in
。
答案 1 :(得分:-1)
从nponeccop收到一条说明,我建议使用这个模板:
import Test.QuickCheck
prop_commutative f g x = ...
main = quickCheck $ prop_commutative f g
where f x = ...
g x = ...
这种方法要求您提出一个反例。这很简单:想想两个函数,当两种方式组合时,不会产生相同的结果。这种方法也利用了部分应用。我已将两个函数交给prop_commutative
,只留下x
,以便生成并测试quickCheck。
但这可能太简单了。如果你能做到这一点,那么下一步就是删除特定的反例并找出如何让quickCheck为你生成函数。