假设我有类似
的类型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 = ???
所以我不知道CoSerial
的概念以及如何使用它们为Serial
制作Int -> m D
。
我还想为y
字段提供相关的序列号。我的意思是,如果x
的样本为0,则y
的序列应该以{{1}}作为参数。有可能吗?
答案 0 :(得分: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
的{{1}}字段应更改为TestIt
。
然后MyFun m
的{{1}}实例变得微不足道。
Serial
与某个常量字符串TestIt
一起使用-带有参数,可以从B
字段的样本中获取(这显示了随机样本之间的“依赖性”,其中一个样本是一个函数):
C