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

Chr*_*dal 3 haskell typeclass quickcheck

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

instance Arbitrary V.Vector Double where
    arbitrary = V.fromList (arbitrary :: [Double])
Run Code Online (Sandbox Code Playgroud)

唉,GHC完全不喜欢这个:

`Arbitrary' is applied to too many type arguments
In the instance declaration for `Arbitrary V.Vector Double'
Run Code Online (Sandbox Code Playgroud)

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

Ven*_*nge 10

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

instance (Arbitrary a) => Arbitrary (V.Vector a) where
    arbitrary = fmap V.fromList arbitrary
Run Code Online (Sandbox Code Playgroud)

需要注意的是你需要的fmap,因为arbitrary是类型的值Gen a,所以为了从去Gen [a]Gen (V.Vector a)需要提起V.fromListGen,你可以这样做,因为这是一个仿函数.