如何为此功能编写串行实例?

时间:2019-07-09 11:52:47

标签: haskell smallcheck

假设我有类似

的类型
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​​}}作为参数。有可能吗?

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