在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
时的行为会有所不同,最初似乎无关紧要。
这种行为有什么意义?
由于