如何让Data.List.Vector轻松成为Arbitrary的成员?

时间:2012-04-26 21:27:34

标签: haskell typeclass quickcheck

我在我的程序中使用Data.List.Vector,现在我想使用quickCheck。但是,没有这方面的例子。由于[Double]已经存在任意,我认为我可以做类似

的事情
instance Arbitrary V.Vector Double where
    arbitrary = V.fromList (arbitrary :: [Double])
唉,GHC根本不喜欢这个:

`Arbitrary' is applied to too many type arguments
In the instance declaration for `Arbitrary V.Vector Double'

我想我也可以制作一堆接受[Double]并使用V.fromList的属性,但这看起来很乏味。

1 个答案:

答案 0 :(得分:10)

您的问题是您需要将其括起来,例如instance Arbitrary (V.Vector Double)等。但是有更好的方法:

instance (Arbitrary a) => Arbitrary (V.Vector a) where
    arbitrary = fmap V.fromList arbitrary

请注意,您需要fmap,因为arbitraryGen a类型的值,因此您需要从Gen [a]转到Gen (V.Vector a)V.fromList提升为Gen,你可以这样做,因为它是一个仿函数。

相关问题