Preconditions that are difficult to meet by generating random test cases are often a bad idea in QuickCheck. Instead, you should use generators carefully to construct test cases that meet the precondition automatically.
For example, in this case, you can use forAll
to generate the second list to be of the same length as the first list:
prop_zip' (xs :: [a]) =
forAll (vectorOf (length xs) arbitrary) $ \ (ys :: [a]) ->
unzip (zip xs ys) == (xs, ys)
(I'm additionally using ScopedTypeVariables
here to determine the type of the second list. You might want to change this to suit your specific needs.)