Show package:leancheck

This module is part of LeanCheck, a simple enumerative property-based testing library. This module exports an orphan Show instance for functions. It shows functions as up to 8 case distinctions, one per line. Warning: this is only intended to be used in testing modules. Avoid importing this on modules that are used as libraries. This is intended to Show functions generated by the Listable instance for functions defined in Test.LeanCheck.Function.Listable: functions that have finite exceptions to a constant function. It does work on other types of functions, albeit using "...".
> print (&&)
\x y -> case (x,y) of
(True,True) -> True
_ -> False
> print (==>)
\x y -> case (x,y) of
(True,False) -> False
_ -> True
> print (==2)
\x -> case x of
2 -> True
_ -> False
> print (\x -> abs x < 2)
\x -> case x of
0 -> True
1 -> True
-1 -> True
_ -> False
When the function cannot be defined by finite exceptions to a constant function using 8 case-patterns, the rest of the function is represented by "...".
> print (+)
\x y -> case (x,y) of
(0,0) -> 0
(0,1) -> 1
(1,0) -> 1
(0,-1) -> -1
(1,1) -> 2
(-1,0) -> -1
(0,2) -> 2
(1,-1) -> 0
...
The exported orphan Show -> instance is actually defined in Test.LeanCheck.Function.Show.EightLines. An alternative is provided in Test.LeanCheck.Function.Show.FourCases. The exported Show instance only works for functions whose ultimate return types are instances of ShowFunction. For user-defined algebraic datatypes that are instances of Show, their ShowFunction instance can be defined by using bindtiersShow:
import Test.LeanCheck.Function.ShowFunction

instance ShowFunction Ty where
bindtiers  =  bindtiersShow
This module is part of LeanCheck, a simple enumerative property-based testing library. This module exports the ShowFunction typeclass, its instances and related functions. Using this module, it is possible to implement a Show instance for functions:
import Test.LeanCheck.ShowFunction
instance (Show a, Listable a, ShowFunction b) => Show (a->b) where
show  =  showFunction 8
This shows functions as a case pattern with up to 8 cases. It will only work for functions whose ultimate return value is an instance of ShowFunction. This module provides instances for most standard data types (Int, Bool, Maybe, ...). Please see the ShowFunction typeclass documentation for how to declare istances for user-defined data types. The modules Test.LeanCheck.Function and Test.LeanCheck.Function.Show exports an instance like the one above.
ShowFunction values are those for which we can return a list of functional bindings. Instances for showable algebraic datatypes are defined using bindtiersShow:
instance ShowFunction Ty where bindtiers  =  bindtiersShow
Given the number of patterns to show, shows a ShowFunction value.
> putStrLn $ showFunction undefined True
True

> putStrLn $ showFunction 3 (id::Int->Int)
\x -> case x of
0 -> 0
1 -> 1
-1 -> -1
...

> putStrLn $ showFunction 4 (&&)
\x y -> case (x,y) of
(True,True) -> True
_ -> False
In the examples above, "..." should be interpreted literally. This can be used as an implementation of show for functions:
instance (Show a, Listable a, ShowFunction b) => Show (a->b) where
show  =  showFunction 8
See showFunctionLine for an alternative without line breaks.
Same as showFunction, but has no line breaks.
> putStrLn $ showFunctionLine 3 (id::Int->Int)
\x -> case x of 0 -> 0; 1 -> 1; -1 -> -1; ...
> putStrLn $ showFunctionLine 3 (&&)
\x y -> case (x,y) of (True,True) -> True; _ -> False
This can be used as an implementation of show for functions:
instance (Show a, Listable a, ShowFunction b) => Show (a->b) where
show  =  showFunction 8
Alternative to show for tiers with one element per line. (useful for debugging, see also printTiers). This function can be useful when debugging your Listable instances.
A drop-in implementation of bindtiers for showable types. Define instances for showable algebraic datatypes as:
instance ShowFunction Ty where bindtiers  =  bindtiersShow