First, provide a Fun datatype which knows about the function structure and show it instead.
Second, implement either function shrinking as described by Klaessen, or lazy-smallcheck-like shrinking.
Perhaps the current instance for a->b should live in a separate module so that it can be optionally imported ?
It would be nice indeed, but this instance is needed to be able to test higher-order functions.
(Note the Show constraint in instance (Serial m a, Show a, Testable m b) => Testable m (a->b).)
instance (Serial m a, Show a, Testable m b) => Testable m (a->b)
This has now become a real problem.
Some of tasty's dependencies (I don't know which one) apparently imports Text.Show.Functions which contains a conflicting Show instance for function. So an attempt to use tasty and test functions using smallcheck results in an error:
Overlapping instances for Show (Bool -> JT Bool Maybe Bool)
arising from a use of `testProperty'
instance [safe] Show (a -> b) -- Defined in `Text.Show.Functions'
instance [overlap ok] (Serial Identity a, Show a, Show b) =>
Show (a -> b)
-- Defined in `Test.SmallCheck.Series'
So, I'm going to remove the Show (a -> b) instance and replace it with a Show Fun instance.
Show (a -> b)
Here are two approaches that I can think of:
I'm tempted to implement both approaches, like QuickCheck does (CoArbitrary vs Argument).