0

假设,我有像

data D = A | B String | C String
data TestIt m = TestIt {
   x :: m Int
 , y :: Int -> m D
}

我正在编写 SmallCheck 测试,所以我需要以下Serial实例TestIt

instance Monad m => Serial m (TestIt m) where
  series = TestIt <$> (pure <$> series) <~> xxx

这个怎么写xxx?我知道它可能需要CoSerial类似的功能,但是 1)我不确定 2)我不知道如何编写它。当我看到CoSerial文档时,我看到我的CoSerial遗嘱有Int而不是D在其定义中:

instance (CoSerial m a) => CoSerial m (Int a) where
  coseries rs = ???

所以我不知道CoSerials 以及如何使用它们来制作Serialfor Int -> m D

我也想拥有yfield的依赖序列。我的意思是如果x有样本 0 那么序列y应该0作为参数。可能吗?

4

1 回答 1

0

例如:

newtype MyFun m = MyFun (Int -> m D)

instance (Monad m, Monad n) => Serial m (MyFun n) where
  series = MyFun <$> (cons0 $ const $ pure $ A)
                 \/  (cons0 $ const $ pure $ B "XXX")
                 -- it shows how to depend on another field sample
                 \/  (cons0 $ \p -> pure $ C $ show p)

并且应该将y字段更改为。TestItMyFun m

然后Serial实例TestIt变得微不足道。

B正在使用一些常量字符串,C- 带有参数,可以从x字段样本中获取(这显示了随机样本之间的“依赖性”,其中一个是函数):

testProperty "diffProcResult" $
   \(t::TestIt Identity) ->
     let (MyFun f) = y t
         yVal = f $ x t
     in ...
于 2019-07-10T05:48:21.367 回答