-
以下代码中应该传递给Co任意的ex是什么?
-
如何使用Test.QuickCheck.Function中的Function来表示命题中的f和g?
-
写正确吗?如果不正确,怎么写?
其中types=[f,g]::[函数]
-
变体可以接受函数吗?正如我所知,generate函数经常使用><或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
[更新]
但它没有实现Co任意http://www.google.com.hk/url?sa=t&rct=j&q=QuickCheck+meiser.pdf&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fww.st.cs.uni saarland.de%2Edu%2Fseminare%2F22005%2Advanced fp%2Fslides%2Fmeiser.pdf&ei=hhfHTo_ZDdCciAethMjqDw&usg=AFQjCNFF467CXacWGMkN8jvgqatkcLcVcg
另一个写入模拟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
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
类型的文档。CCD_ 12存在单态函数。QuickCheck不能生成不同类型的随机函数,只能生成特定类型的函数。但.
是多态的,因此无法从上下文中推断出f的特定类型。因此,您需要为f
和g
选择一些任意类型,并在属性的类型签名中指定它。
此外,顶级定义不需要let
。Let只能在let..in
形式的表达式内部和在没有in
的do
块内部使用。
注意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为你生成函数。