ChasingBottoms-1.2.2: docs/Test-ChasingBottoms-ContinuousFunctions.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--Rendered using the Haskell Html Library v0.2-->
<HTML
><HEAD
><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"
><TITLE
>Test.ChasingBottoms.ContinuousFunctions</TITLE
><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css"
><SCRIPT SRC="haddock.js" TYPE="text/javascript"
></SCRIPT
></HEAD
><BODY
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="topbar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" "
></TD
><TD CLASS="title"
>Chasing Bottoms</TD
><TD CLASS="topbut"
><A HREF="index.html"
>Contents</A
></TD
><TD CLASS="topbut"
><A HREF="doc-index.html"
>Index</A
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="modulebar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><FONT SIZE="6"
>Test.ChasingBottoms.ContinuousFunctions</FONT
></TD
><TD ALIGN="right"
><TABLE CLASS="narrow" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="infohead"
>Portability</TD
><TD CLASS="infoval"
>non-portable (GHC-specific)</TD
></TR
><TR
><TD CLASS="infohead"
>Stability</TD
><TD CLASS="infoval"
>experimental</TD
></TR
><TR
><TD CLASS="infohead"
>Maintainer</TD
><TD CLASS="infoval"
>http://www.cs.chalmers.se/~nad/</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="section4"
><B
>Contents</B
></TD
></TR
><TR
><TD
><DL
><DT
><A HREF="#1"
>Basic framework
</A
></DT
><DT
><A HREF="#2"
>Liftings of some QuickCheck functionality
</A
></DT
><DT
><A HREF="#3"
>Generic <TT
>MakePM</TT
>
</A
></DT
><DT
><A HREF="#4"
>Some <TT
>MakeResult</TT
>s
</A
></DT
></DL
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Description</TD
></TR
><TR
><TD CLASS="doc"
><P
>Note: <EM
>This module is unfinished and experimental. However, I do
not think that I will ever finish it, so I have released it in its
current state. The documentation below may not be completely
correct. The source code lists some things which should be
addressed.</EM
>
</P
><P
>A framework for generating possibly non-strict, partial,
continuous functions.
</P
><P
>The functions generated using the standard QuickCheck <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AArbitrary"
>Arbitrary</A
></TT
>
instances are all strict. In the presence of partial and infinite
values testing using only strict functions leads to worse coverage
than if more general functions are used, though.
</P
><P
>Using <TT
><A HREF="Test-ChasingBottoms-IsBottom.html#v%3AisBottom"
>isBottom</A
></TT
> it is relatively easy to generate possibly
non-strict functions that are, in general, not monotone. For
instance, using
</P
><PRE
> type Cogen a = forall b. a -> Gen b -> Gen b
integer :: Gen Integer
integer = frequency [ (1, return bottom), (10, arbitrary) ]
coBool :: CoGen Bool
coBool b | isBottom b = variant 0
coBool False = variant 1
coBool True = variant 2
function :: Cogen a -> Gen b -> Gen (a -> b)
function coGen gen = promote (\a -> coGen a gen)
</PRE
><P
>we can generate possibly non-strict functions from <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Bool.html#t%3ABool"
>Bool</A
></TT
> to
<TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Prelude.html#t%3AInteger"
>Integer</A
></TT
> using <TT
>function coBool integer</TT
>. There is a high
likelihood that the functions generated are not monotone, though.
The reason that we can get non-monotone functions in a language
like Haskell is that we are using the impure function <TT
><A HREF="Test-ChasingBottoms-IsBottom.html#v%3AisBottom"
>isBottom</A
></TT
>.
</P
><P
>Sometimes using possibly non-monotone functions is good enough,
since that set of functions is a superset of the continuous
functions. However, say that we want to test that <TT
>x
<TT
><A HREF="Test-ChasingBottoms-SemanticOrd.html#v%3A%3C%3D%21"
><=!</A
></TT
> y</TT
> implies that <TT
>f x
<TT
><A HREF="Test-ChasingBottoms-SemanticOrd.html#v%3A%3C%3D%21"
><=!</A
></TT
> f y</TT
> for all functions <TT
>f</TT
>
(whenever the latter expression returns a total result). This
property is not valid in the presence of non-monotone functions.
</P
><P
>By avoiding <TT
><A HREF="Test-ChasingBottoms-IsBottom.html#v%3AisBottom"
>isBottom</A
></TT
> and, unlike the standard <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Acoarbitrary"
>coarbitrary</A
></TT
>
functions, deferring some pattern matches, we can generate
continuous, possibly non-strict functions. There are two steps
involved in generating a continuous function using the framework
defined here.
</P
><OL
><LI
> First the argument to the function is turned into a
<TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TT
>. A <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TT
> wraps up the pattern match on
the top-level constructor of the argument, plus all further
pattern matches on the children of the argument. Just like when
<TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Acoarbitrary"
>coarbitrary</A
></TT
> is used a pattern match is represented as a
generator transformer. The difference here is that there is not
just one transformation per input, but one transformation per
constructor in the input. <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TT
>es can be constructed
generically using <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Amatch"
>match</A
></TT
>.
</LI
><LI
> Then the result is generated, almost like for a normal
<TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AArbitrary"
>Arbitrary</A
></TT
> instance. However, for each constructor generated a
subset of the transformations from step 1 are applied. This
transformation application is wrapped up in the function
<TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Atransform"
>transform</A
></TT
>.
</LI
></OL
><P
>The net result of this is that some pattern matches are performed
later, or not at all, so functions can be lazy.
</P
><P
>Here is an example illustrating typical use of this framework:
</P
><PRE
> data Tree a
= Branch (Tree a) (Tree a)
| Leaf a
deriving (Show, Typeable, Data)
finiteTreeOf :: MakeResult a -> MakeResult (Tree a)
finiteTreeOf makeResult = sized' tree
where
tree size = transform $
if size == 0 then
baseCase
else
frequency' [ (1, baseCase)
, (1, liftM2 Branch tree' tree')
]
where
tree' = tree (size `div` 2)
baseCase =
frequency' [ (1, return bottom)
, (2, liftM Leaf makeResult)
]
</PRE
><P
>Note the use of <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Atransform"
>transform</A
></TT
>. To use this function to generate
functions of type <TT
>Bool -> Tree Integer</TT
> we can use
</P
><PRE
> forAll (functionTo (finiteTreeOf flat)) $
\(f :: Bool -> Tree Integer) ->
...
</PRE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Synopsis</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="#v%3Afunction"
>function</A
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakePM"
>MakePM</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> b -> <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> (a -> b)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AfunctionTo"
>functionTo</A
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Generics-Basics.html#t%3AData"
>Data</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> b -> <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> (a -> b)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
> <A HREF="#t%3APatternMatch"
>PatternMatch</A
> = <A HREF="#v%3APatternMatch"
>PatternMatch</A
> {<TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aapply"
>apply</A
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AGenTransformer"
>GenTransformer</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Amore"
>more</A
> :: (<A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/containers-0.1.0.0/Data-Sequence.html#t%3ASeq"
>Seq</A
> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
>)</TD
></TR
></TABLE
>}</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3AGenTransformer"
>GenTransformer</A
> = <SPAN CLASS="keyword"
>forall</SPAN
> a . <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> a -> <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3AMakePM"
>MakePM</A
> a = a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
> <A HREF="#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Atransform"
>transform</A
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Alift%27"
>lift'</A
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Aarbitrary%27"
>arbitrary'</A
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AArbitrary"
>Arbitrary</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Achoose%27"
>choose'</A
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/random-1.0.0.0/System-Random.html#t%3ARandom"
>Random</A
> a => (a, a) -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Aelements%27"
>elements'</A
> :: [a] -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Aoneof%27"
>oneof'</A
> :: [<A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a] -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Afrequency%27"
>frequency'</A
> :: [(<A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Int.html#t%3AInt"
>Int</A
>, <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a)] -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Asized%27"
>sized'</A
> :: (<A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Int.html#t%3AInt"
>Int</A
> -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a) -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Aresize%27"
>resize'</A
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Int.html#t%3AInt"
>Int</A
> -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Amatch"
>match</A
> :: <SPAN CLASS="keyword"
>forall</SPAN
> a . <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Generics-Basics.html#t%3AData"
>Data</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakePM"
>MakePM</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Aflat"
>flat</A
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AArbitrary"
>Arbitrary</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AfiniteListOf"
>finiteListOf</A
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> [a]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AinfiniteListOf"
>infiniteListOf</A
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> [a]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AlistOf"
>listOf</A
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> [a]</TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="1"
>Basic framework
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Afunction"
></A
><B
>function</B
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakePM"
>MakePM</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> b -> <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> (a -> b)</TD
></TR
><TR
><TD CLASS="doc"
>Generator for continuous, not necessarily strict functions.
Functions are generated by first generating pattern matches, and
then generating a result.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3AfunctionTo"
></A
><B
>functionTo</B
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Generics-Basics.html#t%3AData"
>Data</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> b -> <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> (a -> b)</TD
></TR
><TR
><TD CLASS="doc"
><P
><TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3AfunctionTo"
>functionTo</A
></TT
> specialises <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Afunction"
>function</A
></TT
>:
</P
><PRE
>
<TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3AfunctionTo"
>functionTo</A
></TT
> = <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Afunction"
>function</A
></TT
> <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Amatch"
>match</A
></TT
>
</PRE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
> <A NAME="t%3APatternMatch"
></A
><B
>PatternMatch</B
> </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
><TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TT
> packages up the possible outcomes of a pattern
match in a style suitable for generating functions. A pattern match
is a generator (<TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
></TT
>) transformer based on the top-level
constructor, and a sequence (see
<A HREF="http://www.soi.city.ac.uk/~ross/software/html/Data.Sequence.html"
>http://www.soi.city.ac.uk/~ross/software/html/Data.Sequence.html</A
>) of
<TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TT
>es based on the children of that constructor.
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="5" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v%3APatternMatch"
></A
><B
>PatternMatch</B
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="body" COLSPAN="2"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v%3Aapply"
></A
><B
>apply</B
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AGenTransformer"
>GenTransformer</A
></TD
><TD CLASS="rdoc"
>A generator transformer, in the style of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Acoarbitrary"
>coarbitrary</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v%3Amore"
></A
><B
>more</B
> :: (<A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/containers-0.1.0.0/Data-Sequence.html#t%3ASeq"
>Seq</A
> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
>)</TD
><TD CLASS="rdoc"
>Further pattern matches made possible by this
match.
</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t%3AGenTransformer"
></A
><B
>GenTransformer</B
> = <SPAN CLASS="keyword"
>forall</SPAN
> a . <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> a -> <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>The type of a generator transformer.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t%3AMakePM"
></A
><B
>MakePM</B
> a = a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TD
></TR
><TR
><TD CLASS="doc"
>The type of a <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TT
> generator.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
> <A NAME="t%3AMakeResult"
></A
><B
>MakeResult</B
> a</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
><P
>Monad for generating results given previously generated pattern
matches.
</P
><P
>A <TT
><TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
></TT
> a</TT
> should be implemented almost as other generators for
the type <TT
>a</TT
>, with the difference that <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Atransform"
>transform</A
></TT
> should be
used wherever the resulting function should be allowed to pattern
match (typically for each constructor emitted). See example above.
</P
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:MakeResult')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:MakeResult" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
>??? a => <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Control-Monad.html#t%3AFunctor"
>Functor</A
> (<A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a)</TD
></TR
><TR
><TD CLASS="decl"
>??? a => <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Control-Monad.html#t%3AMonad"
>Monad</A
> (<A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a)</TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Atransform"
></A
><B
>transform</B
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
><TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#v%3Atransform"
>transform</A
></TT
> makes sure that the pattern matches get to influence
the generated value. See <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="2"
>Liftings of some QuickCheck functionality
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Alift%27"
></A
><B
>lift'</B
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of a <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AGen"
>Gen</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Aarbitrary%27"
></A
><B
>arbitrary'</B
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AArbitrary"
>Arbitrary</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Aarbitrary"
>arbitrary</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Achoose%27"
></A
><B
>choose'</B
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/random-1.0.0.0/System-Random.html#t%3ARandom"
>Random</A
> a => (a, a) -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Achoose"
>choose</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Aelements%27"
></A
><B
>elements'</B
> :: [a] -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Aelements"
>elements</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Aoneof%27"
></A
><B
>oneof'</B
> :: [<A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a] -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Aoneof"
>oneof</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Afrequency%27"
></A
><B
>frequency'</B
> :: [(<A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Int.html#t%3AInt"
>Int</A
>, <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a)] -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Afrequency"
>frequency</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Asized%27"
></A
><B
>sized'</B
> :: (<A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Int.html#t%3AInt"
>Int</A
> -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a) -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Asized"
>sized</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Aresize%27"
></A
><B
>resize'</B
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Int.html#t%3AInt"
>Int</A
> -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Lifting of <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#v%3Aresize"
>resize</A
></TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="3"
>Generic <TT
>MakePM</TT
>
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Amatch"
></A
><B
>match</B
> :: <SPAN CLASS="keyword"
>forall</SPAN
> a . <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/base-3.0.0.0/Data-Generics-Basics.html#t%3AData"
>Data</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakePM"
>MakePM</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>Generic implementation of <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3APatternMatch"
>PatternMatch</A
></TT
> construction.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="4"
>Some <TT
>MakeResult</TT
>s
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3Aflat"
></A
><B
>flat</B
> :: <A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AArbitrary"
>Arbitrary</A
> a => <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a</TD
></TR
><TR
><TD CLASS="doc"
>An implementation of <TT
><TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
></TT
> a</TT
> which is suitable when <TT
>a</TT
>
is flat and has an <TT
><A HREF="http://www.haskell.org/ghc/docs/latest/html/libraries/QuickCheck-1.1.0.0/Test-QuickCheck.html#t%3AArbitrary"
>Arbitrary</A
></TT
> instance. Yields bottoms around 10%
of the time.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3AfiniteListOf"
></A
><B
>finiteListOf</B
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> [a]</TD
></TR
><TR
><TD CLASS="doc"
>This <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
></TT
> yields finite partial lists.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3AinfiniteListOf"
></A
><B
>infiniteListOf</B
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> [a]</TD
></TR
><TR
><TD CLASS="doc"
>This <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
></TT
> yields infinite partial lists.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3AlistOf"
></A
><B
>listOf</B
> :: <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> a -> <A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
> [a]</TD
></TR
><TR
><TD CLASS="doc"
>This <TT
><A HREF="Test-ChasingBottoms-ContinuousFunctions.html#t%3AMakeResult"
>MakeResult</A
></TT
> yields finite or infinite partial lists.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="botbar"
>Produced by <A HREF="http://www.haskell.org/haddock/"
>Haddock</A
> version 0.7</TD
></TR
></TABLE
></BODY
></HTML
>