在Haskell中使用QuickCheck和Debug.Trace时出现奇怪的行为

时间:2015-12-06 01:16:10

标签: haskell

在Haskell中使用QuickCheck和Debug.Trace时,我遇到了一个奇怪的行为。我有下面的代码,它定义了一个类型S,并使其成为任意类型类的实例。在arbitrary的实施过程中,我使用Debug.Trace.trace来跟踪正在发生的事情。

data S = C Float | R Float Float | T Float Float Float deriving Show
instance Arbitrary S where
  arbitrary = do
    x <- return () -- STRANGE: Without this line, the string "aaa" is only
                   --          shown for the first occurrence of a C value.
                   --          But with it, the string "aaa" is show for 
                   --          every arbitrary value of a C value.
    aaa <- Debug.Trace.trace "aaa" $ choose (0.0, 10.0)
    bbb <- Debug.Trace.trace "bbb" $ choose (0.0, 10.0)
    ccc <- choose (0.0, 10.0)
    ddd <- choose (0.0, 10.0)
    eee <- choose (0.0, 10.0)
    fff <- Debug.Trace.trace "fff" $ choose (0.0, 10.0)
    elements [C aaa,
              R bbb ccc,
              T ddd eee fff]
prop_s (C x) = True
prop_s (R x y) = True
prop_s (T x y z) = True
p = verboseCheckWith stdArgs {maxSuccess = 10 } prop_s

奇怪的是,在评估GHCi中的x <- return ()时,前面的代码在使用和不使用行p时的行为会有所不同,最初似乎无关紧要。

这种行为有什么意义?

由于

0 个答案:

没有答案