Как легко сделать Data.List.Vector членом Arbitrary?

Я использую 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, но это кажется утомительным.


person Christian Neverdal    schedule 26.04.2012    source источник


Ответы (1)


Ваша проблема в том, что вам нужно заключить его в скобки, например instance Arbitrary (V.Vector Double) и т. д. Но есть лучший способ сделать это:

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

Обратите внимание, что вам нужен fmap, потому что arbitrary является значением типа Gen a, и поэтому, чтобы перейти от Gen [a] к Gen (V.Vector a), вам нужно поднять V.fromList до Gen, что вы можете сделать, поскольку это функтор.

person Venge    schedule 26.04.2012