Improve showing functions #11

feuerbach opened this Issue Jan 25, 2013 · 4 comments


None yet

2 participants


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).)


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'
Matching instances:
  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.


Here are two approaches that I can think of:

  • When generating a function, store the additional information (such as the inspected size of the argument and the default value) so that we know what/how to show
  • Use the LogicT continuations to "refine" the function akin to lazy smallcheck. First try with the a never defined function, then catch exceptions and add cases to the table. This will work only with first-order functions, but OTOH it will produce much better results

I'm tempted to implement both approaches, like QuickCheck does (CoArbitrary vs Argument).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment