-2
  1. 应该传递给以下代码的 CoArbitrary 的 ex 是什么?

  2. 如何使用 Test.QuickCheck.Function 中的 Function 来表示命题中的 f 和 g?

  3. 写是正确的,如果不是,怎么写?

    其中类型 = [f, g] :: [函数]

  4. 变体可以接受 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

[更新]

但它没有实现 CoArbitrary http://www.google.com.hk/url?sa=t&rct=j&q=QuickCheck+meiser.pdf&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fwww.st.cs。 uni-saarland.de%2Fedu%2Fseminare%2F2005%2Fadvanced-fp%2Fslides%2Fmeiser.pdf&ei=hhfHTo_ZDdCciAethMjqDw&usg=AFQjCNFF467CXacWGMkN8jvgqatkcLcVcg

另一种写法模仿函数中的示例,在 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
4

2 回答 2

3

QuickCheck 寻找反例。因此,您需要提供对您寻求的属性的否定:

prop1 f g x = not $ (f . g) x == (g . f) x

此特定属性未指定函数类型 - 任何函数都a -> a可以工作。因此,您需要为fandg或整个函数指定类型prop1

  1. 您无法比较f . gg . ffor 相等,因为它们都是函数,并且您无法Eq在 Haskell 中对具有无限域的函数进行合理的定义。您还需要随机生成参数,并通过将随机参数传递给两者来比较它们的结果来比较f . gand函数。g . f

  2. 阅读有关Fun _ f. _ f有一个单态函数。QuickCheck 不能生成不同类型的随机函数——它只能生成某些特定类型的函数。但是.多态的,所以不能从上下文中推断出 f 的特定类型。因此,您需要为您的属性选择一些任意类型fg在类型签名中指定它。

此外,您不需要let顶级定义。Let 只能在没有 . 的块形式的表达式内部let..in和内部使用。doin

于 2011-11-18T13:17:31.690 回答
-1

记下 nponeccop 的笔记,我建议使用此模板:

import Test.QuickCheck

prop_commutative f g x = ...

main = quickCheck $ prop_commutative f g
  where f x = ...
        g x = ...

这种方法需要你想出一个反例。这很简单:想想两个函数,当它们以两种方式组合时,不会产生相同的结果。这种方法也利用了部分应用。我已经将两个函数交给了prop_commutative,只留下了xfor quickCheck 来生成和测试。

不过,这可能太简单了。如果你能做到这一点,那么下一步就是删除具体的反例,并弄清楚如何让 quickCheck 为你生成函数。

于 2011-11-18T21:39:23.473 回答